// 完整的报错信息
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 对象就有了