You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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禁用规则:

  1. 打开JDK安装路径下的jre/lib/security/java.security文件,找到jdk.tls.disabledAlgorithms配置项,删除你需要兼容的低版本TLS协议(如TLSv1、TLSv1.1)对应的条目
  2. 也可在程序启动时添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:15:03