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

Apache HttpClient 4.5.5禁用SSL证书校验失败及SSLProtocolException问题

解决Apache HttpClient 4.5.5中的javax.net.ssl.SSLProtocolException: no more data allowed for version 1 certificate问题

这个错误的核心原因不是证书校验的问题,而是目标服务器使用了非常老旧的SSLv1协议——现代JDK默认已经禁用了SSLv1支持,你之前的配置只是跳过了证书信任和主机名验证,但没解决协议兼容性的本质问题。

下面是针对HttpClient 4.5.5的完整解决方案,同时兼容你需要跳过证书校验的需求:

import org.apache.http.client.HttpClient;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.HttpClients;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;

public class Sslv1HttpClientCreator {
    public static HttpClient createSslv1CompatibleClient() {
        try {
            // 1. 实现信任所有证书的TrustManager
            X509TrustManager trustAllCert = new X509TrustManager() {
                @Override
                public void checkClientTrusted(X509Certificate[] chain, String authType) {}
                @Override
                public void checkServerTrusted(X509Certificate[] chain, String authType) {}
                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return new X509Certificate[0];
                }
            };

            // 2. 构建支持SSLv1的SSLContext
            SSLContext sslContext = SSLContext.getInstance("SSL"); // "SSL"对应SSLv1协议
            sslContext.init(null, new TrustManager[]{trustAllCert}, new java.security.SecureRandom());

            // 3. 创建指定SSLv1协议的连接套接字工厂
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                    sslContext,
                    new String[]{"SSL"}, // 显式限定使用SSLv1协议
                    null,
                    NoopHostnameVerifier.INSTANCE
            );

            // 4. 组装HttpClient实例
            return HttpClients.custom()
                    .setSSLSocketFactory(sslsf)
                    .build();
        } catch (Exception e) {
            throw new RuntimeException("创建支持SSLv1的HttpClient失败", e);
        }
    }
}

关键细节说明:

  • 我们通过SSLContext.getInstance("SSL")直接初始化支持SSLv1的上下文,同时显式指定协议数组为{"SSL"},确保HttpClient只会使用SSLv1与目标服务器通信,解决协议不兼容的问题。
  • 保留了信任所有证书和跳过主机名验证的逻辑,满足你原本禁用证书校验的需求。
  • 重要提醒:SSLv1是极度不安全的协议,存在严重的安全漏洞,这个方案只是临时应急手段,强烈建议你推动目标服务器升级到TLS 1.2及以上版本。

如果上述代码仍然报错,你可能需要检查JDK的java.security文件,确认是否有禁用SSLv1的配置(比如jdk.tls.disabledAlgorithms里包含SSLv1),如果有可以临时移除该配置,但同样不建议长期这么做。

内容的提问来源于stack exchange,提问作者Helen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:12:22