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

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 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程