httpclient4.5.13绕过SSL验证仍报SSLHandshakeException协议版本错误如何解决
你遇到的javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version 异常与SSL证书信任校验无关,是客户端与服务端TLS协议版本协商失败导致的,你之前的配置仅绕过了证书信任校验,无法解决协议版本不匹配问题。
方案1:显式指定HttpClient支持的TLS协议版本
修改自定义SSLConnectionSocketFactory的创建逻辑,手动指定兼容的TLS协议列表,覆盖默认的协商范围,修改后代码如下:
private SSLConnectionSocketFactory sslFactory() { SSLContext sslcontext = null; try { sslcontext = SSLContexts.custom().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build(); } catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) { e.printStackTrace(); } // 按需配置支持的TLS协议版本,覆盖默认协商范围 String[] supportedTlsProtocols = new String[]{"TLSv1", "TLSv1.1", "TLSv1.2", "TLSv1.3"}; SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory( sslcontext, supportedTlsProtocols, null, (s, sslSession) -> true ); return sslConnectionSocketFactory; }
如果目标站点仅支持特定TLS版本,可调整上述数组内的条目适配。
方案2:调整JDK的TLS协议支持规则
如果修改HttpClient配置后仍报错,检查JDK的全局TLS禁用规则:
- 打开JDK安装路径下的
jre/lib/security/java.security文件,找到jdk.tls.disabledAlgorithms配置项,删除你需要兼容的低版本TLS协议(如TLSv1、TLSv1.1)对应的条目 - 也可在程序启动时添加JVM参数强制开启指定TLS版本支持:
-Djdk.tls.client.protocols=TLSv1,TLSv1.1,TLSv1.2,TLSv1.3
额外注意事项
- 若你使用的JDK8版本低于8u161,默认不支持TLSv1.3,可升级JDK小版本,或从
supportedTlsProtocols数组中移除TLSv1.3条目 - 若还是无法解决,可通过添加JVM参数打印SSL握手日志定位具体协商失败的原因:
-Djavax.net.debug=ssl,handshake
内容的提问来源于stack exchange,提问作者Anton Cavanaugh
相关产品推荐
相关产品推荐

