javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

https 和 证书认证

错误:

Exception in thread "main" javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
       at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:946)
       at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
       at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
       at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
       at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563)
       at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
       at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1091)
       at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250)
       at com.labcorp.efone.vendor.TestATTConnectivity.main(TestATTConnectivity.java:43)
Caused by: java.io.EOFException: SSL peer shut down incorrectly
       at sun.security.ssl.InputRecord.read(InputRecord.java:482)
       at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927)
       ... 8 more

这个问题涉及到了 SSL/TLS 的握手和通信过程中,安全认证被分为单向认证和双向认证。双向认证就是说,server也会要求验证client的证书,而用Java程序模拟时没有启用证书,所以导致认证阶段出错,握手失败。

解决方法

1、访问https网站,下载证书

a. 浏览器地址栏旁边会有一个锁的图标,点击那个锁,会有查看证书的按钮;
b. 将证书信息导出,证书格式有很多种,der、cer等,我保存的是cer格式的

2、利用jdk的key tool工具,将证书转换成密钥的形式

keytool -import -alias "my alipay cert" -file steven.cert     -keystore my.store,keytool -import -alias "my alipay cert" -file steven.cert     -keystore my.store

3、sslContext中载入信用证书


    private static SSLContext sslcontext;
        try {
            sslcontext = SSLContexts.custom()
                    .loadTrustMaterial(new File("D:\\my.keystore"), "123456".toCharArray(),
                            new TrustSelfSignedStrategy())
                    .build();
        } catch (Exception e) {
            e.printStackTrace();
        }
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                sslcontext,
                new String[]{"TLSv1"},
                null,
                SSLConnectionSocketFactory.getDefaultHostnameVerifier());
        httpClient = HttpClients.custom()
                .setSSLSocketFactory(sslsf)
                .setDefaultCookieStore(cookieStore)
                // 异常重试机制 3次 (网络层面上的)
                .setRetryHandler(new DefaultHttpRequestRetryHandler(3,true))
                .setDefaultRequestConfig(defaultRequestConfig)
                .build();

转载自 httpClient进阶: https 和 证书认证

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
javax.net.ssl.SSLHandshakeException: Connection closed by peer通常是由于SSL握手失败引起的。这可能是由于以下原因之一导致的: 1. 服务器不支持SSL协议版本或加密套件。 2. 客户端和服务器之间存在代理,代理可能会干扰SSL握手。 3. 证书问题,例如证书过期或不受信任。 解决此问题的方法包括: 1. 确保服务器支持客户端使用的SSL协议版本和加密套件。 2. 检查代理设置并尝试直接连接服务器。 3. 检查证书是否过期或不受信任,并确保证书链完整。 以下是一些可能有用的代码片段: ```java // 禁用SSL验证 TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(X509Certificate[] certs, String authType) { } public void checkServerTrusted(X509Certificate[] certs, String authType) { } }}; SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); // 设置代理 System.setProperty("https.proxyHost", "yourProxyServerHostname"); System.setProperty("https.proxyPort", "yourProxyServerPort"); // 打印证书信息 HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.connect(); Certificate[] certs = conn.getServerCertificates(); for (Certificate cert : certs) { System.out.println(cert); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值