banner
指数爆炸

指数爆炸

我做了对饭 !
github
bilibili

如何忽略 SSL 证书验证:javax.net.ssl.SSLHandshakeException

// 完整的报错信息
javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

这个错误意味着 SSL/TLS 握手过程中,客户端无法验证服务器的 SSL 证书。原因有:

  • 服务器证书不被客户端信任:服务器的 SSL 证书可能未被客户端信任的证书颁发机构(CA)签发,或者证书已过期。
  • 网络问题:在某些情况下,如果客户端和服务器之间的网络连接存在问题,也可能导致 SSL 握手失败。

证书方面解决#

那就是在服务端解决了,但是一般我们都是调用被人的接口,对方的 SSL 证书有问题,我们也不能帮别人修改对吧

自己解决#

自己解决那就是忽略 SSL 证书验证,但这会降低安全性,不建议使用,除非迫不得已

// 创建一个无需验证SSL的OkHttpClient
public static OkHttpClient getClient() throws NoSuchAlgorithmException, KeyManagementException {
    TrustManager[] trustManagers = new TrustManager[]{
            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];
                }
            }
    };

    SSLContext sslContext = SSLContext.getInstance("SSL");
    sslContext.init(null, trustManagers, new SecureRandom());

    final OkHttpClient client = new OkHttpClient.Builder()
            .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustManagers[0])
            .hostnameVerifier((s, sslSession) -> true)
            .build();

    return client;
}

private final OkHttpClient client = getClient();

// 现在忽略 SSL 证书验证的 OKHttpClient 对象就有了
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。