遗憾¢♡ 2021-10-09 22:20 采纳率: 100%
浏览 105
已结题

https请求微信分账接口 使用证书双向认证,报错java.lang.IllegalArgumentException: no SSLSocketFactory specified

https请求微信分账接口 使用证书双向认证,
在本地可以收到返回 在Linux服务器中发起请求之后报错
java.lang.IllegalArgumentException: no SSLSocketFactory specified

在本地跑是没问题的 一上服务器就挂了 ,证书认证也是加上了的,请求帮助 谢谢!

public static String sendXmlWithCertificate(String urlStr, String xmlInfo, String mchId) {
        BufferedReader br = null;
        try {
            URL url = new URL(urlStr);
            HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            // 设置通用的请求属性
            connection.setUseCaches(false);
            connection.setDoOutput(true);
            connection.setDoInput(true);
            //设置报文格式
            connection.setRequestProperty("Content-Type", "text/xml");
            //证书双向验证
            connection.setSSLSocketFactory(readCertificate(mchId));

            // 得到请求的输出流对象
            DataOutputStream out = new DataOutputStream(connection.getOutputStream());
            out.write(xmlInfo.getBytes(StandardCharsets.UTF_8));
            out.flush();
            out.close();

            // 建立实际的连接
            connection.connect();
            // 定义 BufferedReader输入流来读取URL的响应
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
            StringBuilder result = new StringBuilder();
            String getLine;
            while ((getLine = in.readLine()) != null) {
                result.append(getLine);
            }
            in.close();
            return result.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

public static SSLSocketFactory readCertificate(String mchId) {
        try {
            KeyStore keyStore = KeyStore.getInstance("PKCS12");
            String filePath = Class.class.getResource("/").getPath() + "wxpaycert/apiclient_cert_" + mchId + ".p12";
            FileInputStream stream = new FileInputStream(filePath);
            keyStore.load(stream, mchId.toCharArray());
            stream.close();
            SSLContext sslContext = SSLContexts.custom().loadKeyMaterial(keyStore, mchId.toCharArray()).build();
            return sslContext.getSocketFactory();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

  • 写回答

1条回答 默认 最新

  • 心怀啊 2021-10-09 22:34
    关注

    证书文件路径是对的吗

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月17日
  • 已采纳回答 10月9日
  • 创建了问题 10月9日

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题