// 完整的報錯信息
javax.net.ssl.SSLHandshakeException: PKIX 路徑構建失敗:sun.security.provider.certpath.SunCertPathBuilderException:無法找到有效的證書路徑到請求的目標
這個錯誤意味著在 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對象就有了