問題及處理方法記錄
Http請求時候出現這個問題,一般都是請求的Url使用的是Https ,但是安全證書有問題,導致請求失敗,根源在證書問題上,這裏我們不影響開發的話,可以在代碼裏面配置,暫時避免這個錯誤。
1、項目中添加這個類
public class SSLSocketClient {
// 獲取這個SSLSocketFactory
public static SSLSocketFactory getSSLSocketFactory() {
try {
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, getTrustManager(), new SecureRandom());
return sslContext.getSocketFactory();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// 獲取TrustManager
private static TrustManager[] getTrustManager() {
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[0];
}
}
};
return trustAllCerts;
}
// 獲取HostnameVerifier
public static HostnameVerifier getHostnameVerifier() {
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
}
};
return hostnameVerifier;
}
}
2、OkhttpClicent配置
public OkHttpClient.Builder createOkHttpBuilder() {
OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder();
...
// 添加下面兩句代碼
okHttpBuilder.sslSocketFactory(SSLSocketClient.getSSLSocketFactory());
okHttpBuilder.hostnameVerifier(SSLSocketClient.getHostnameVerifier());
return okHttpBuilder;
}