使用xUtils3發送https請求報錯javax.net.ssl.SSLPeerUnverifiedException: Hostname ***.****.**not verified。
我想不驗證證書直接進行訪問(和http一樣了)。
解決過程:
剛開始設置 (requestParams是參數對象)
/** 判斷https證書是否成功驗證 */
SSLContext sslContext = getSSLContext(MyApp.mContext);
if (null == sslContext) {
Utils.LogUtils("Error:Can't Get SSLContext!");
return;
}
requestParams.setSslSocketFactory(sslContext.getSocketFactory()); //綁定SSL證書(https請求)
/**
* 獲取Https的證書
*
* @param context Activity(fragment)的上下文
* @return SSL的上下文對象
*/
private static SSLContext s_sSLContext = null;
private static SSLContext getSSLContext(Context context) {
try {
s_sSLContext = SSLContext.getInstance("TLS");
//信任所有證書 (官方不推薦使用)
s_sSLContext.init(null, new TrustManager[]{new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
}
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
}
}}, new SecureRandom());
return s_sSLContext;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
結果還是報錯,網上搜了一下:
在設置信任所有證書前要執行setDefaultHostnameVerifier方法,可是Xutils3裏面的requestParams並沒有這個方法。怎麼辦,繼續找。。。。
終於發現:
在初始化Xutitls時:
x.Ext.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
問題解決。