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

Copy
// 完整的报错信息
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 证书验证，但这会降低安全性，不建议使用，除非迫不得已

Copy
// 创建一个无需验证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 对象就有了