Android https 證書信任問題

由於最近公司的open api服務器訪問協議換成了https,因此 android 在使用okhttp 走https 訪問的時候遇到了證書信任的問題,java

在這裏把我走過的彎路記下來,一如既往的話很少說,上碼:android

OkHttpClient   sClient = new OkHttpClient();

// 設置超時時間
sClient.setConnectTimeout(8000, TimeUnit.MILLISECONDS);
sClient.setReadTimeout(8000, TimeUnit.MILLISECONDS);
// 註冊攔截器
sClient.interceptors().add(new BaseInterceptor(context));

第一種方式:api

sClient.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

運行結果:服務器

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
11-26 11:17:57.264 17106-17268/com.dooioo.addressbook W/System.err: at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:410)
11-26 11:17:57.264 17106-17268/com.dooioo.addressbook W/System.err: at com.squareup.okhttp.Connection.connectTls(Connection.java:235)
11-26 11:17:57.264 17106-17268/com.dooioo.addressbook W/System.err: at com.squareup.okhttp.Connection.connectSocket(Connection.java:199)
11-26 11:17:57.264 17106-1726

以失敗了結!!!!!session

通過多處查詢後採用dom

第二種方案:ide

sClient.setHostnameVerifier(new HostnameVerifier() {
    @Override
    public boolean verify(String hostname, SSLSession session) {
        return true;
    }
});

懷着僥倖的心理運行了一下spa

運行結果:.net

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
11-27 16:18:54.417 16801-16946/com.dooioo.addressbook W/System.err:     at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:410)
11-27 16:18:54.417 16801-16946/com.dooioo.addressbook W/System.err:     at com.squareup.okhttp.Connection.connectTls(Connection.java:235)
11-27 16:18:54.417 16801-16946/com.dooioo.addressbook W/System.err:     at com.squareup.okhttp.Connection.connectSocket(Connection.java:199)
11-27 16:18:54.427 16801-16946/com.dooioo.addressbook W/System.err:     at com.squareup.okhttp.Connection.connect(Connection.java:172)
11-27 16:18:54.427 16801-16943/com.dooioo.addressbook W/System.err: 	at javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
11-27 16:18:54.427 16801-16943/com.dooioo.addressbook W/System.err:     at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:410)
11-27 16:18:54.427 16801-16943/com.dooioo.addressbook W/System.err:     at com.squareup.okhttp.Connection.connectTls(Connection.java:235)
11-27 16:18:54.427 16801-16943/com.dooioo.addressbook W/System.err:     at com.squareup.okhttp.Connection.connectSocket(Connection.java:199)
11-27 16:18:54.427 16801-16943/com.dooioo.addressbook W/System.err:     at com.squareup.okhttp.Connection.connect(Connection.java:172)
11-27 16:18:54.427 16801-16943/com.dooioo.addressbook W/System.err:     at com.squareup.okhttp.Connection.connectAndSetOwner(Connection.java:367)
11-27 16:18:54.427 16801-16946/com.dooioo.addressbook W/System.err:     at com.squareup.okhttp.Connection.connectAndSetOwner(Connection.java:367)
11-27 16:18:54.427 16801-16943/com.dooioo.addressbook W/System.err:     at com.squareup.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:128)
11-27 16:18:54.427 16801-16943/com.dooioo.addressbook W/System.err:     at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:328)
11-27 16:18:54.427 16801-16943/com.dooioo.addressbook W/System.err:     at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:245)

一樣仍是以失敗而了結呢,這下怎麼辦呢,總不能說部解決吧,只好硬着頭皮繼續找資料code

最終的解決方案:

SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[]{new X509TrustManager() {
    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {

    }

    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {

    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }
}}, new SecureRandom());
sClient.setSslSocketFactory(sc.getSocketFactory());
sClient.setHostnameVerifier(new HostnameVerifier() {
    @Override
    public boolean verify(String hostname, SSLSession session) {
        return true;
    }
});

最終解決問題,成功信任全部證書!!!!

固然了,這個最好是用在開發環境上,正式環境的證書信息,最好不要用這種所有信任的方式,否則https 就形同虛設了……

對應的問題請移步>>>>>>>>>Android https 信任

相關文章
相關標籤/搜索