2015-11-19 81 views
3

請別人幫助擺脫此信任定位符錯誤。我嘗試使用http://www.snip2code.com/Snippet/25364/Get-OkHttpClient-which-ignores-all-SSL-e作爲https連接,但返回錯誤以下。Android:改造HTTPS連接不起作用

D/Retrofit﹕ javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 
     at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:328) 
+0

你試過自​​己研究這個錯誤嗎?該鏈接甚至沒有任何背景。這只是一個沒有解釋的代碼片段。你需要安裝一個證書才能工作嗎? – Matt

+0

是@馬特,你能告訴我或我提供證明文件(適用於所有) –

+1

好像網站您嘗試使用**自簽名證書**,嘗試提取網站證書,包括它在你的代碼。 – Akhil

回答

1

嘗試使用下面的示例代碼:

private TrustManager[] getWrappedTrustManagers(TrustManager[] trustManagers) { 
     final X509TrustManager originalTrustManager = (X509TrustManager) trustManagers[0]; 
     return new TrustManager[]{ 
       new X509TrustManager() { 
        public X509Certificate[] getAcceptedIssuers() { 
         return originalTrustManager.getAcceptedIssuers(); 
        } 
        public void checkClientTrusted(X509Certificate[] certs, String authType) { 
         try { 
          originalTrustManager.checkClientTrusted(certs, authType); 
         } catch (CertificateException ignored) { 
         } 
        } 
        public void checkServerTrusted(X509Certificate[] certs, String authType) { 
         try { 
          originalTrustManager.checkServerTrusted(certs, authType); 
         } catch (CertificateException ignored) { 
         } 
        } 
       } 
     }; 
    } 

    private SSLSocketFactory getSSLSocketFactory() 
      throws CertificateException, KeyStoreException, IOException, 
        NoSuchAlgorithmException, KeyManagementException { 
     CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
     InputStream caInput = getResources().openRawResource(R.raw.your_cert); // your certificate file 
     Certificate ca = cf.generateCertificate(caInput); 
     caInput.close(); 
     KeyStore keyStore = KeyStore.getInstance("BKS"); 
     keyStore.load(null, null); 
     keyStore.setCertificateEntry("ca", ca); 
     String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); 
     TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); 
     tmf.init(keyStore); 
     TrustManager[] wrappedTrustManagers = getWrappedTrustManagers(tmf.getTrustManagers()); 
     SSLContext sslContext = SSLContext.getInstance("TLS"); 
     sslContext.init(null, wrappedTrustManagers, null); 
     return sslContext.getSocketFactory(); 
    } 

然後你可以設置OkHttpClient在您的項目如下所示:

okHttpClient.setSslSocketFactory(getSSLSocketFactory()); 

關於setHostnameVerifier,看起來就像你有一個在你的問題鏈接解決方案。

希望這會有所幫助!

+0

的問題是證書,因爲從凌空和iOS HTTPS工作正常,不附帶任何證書。 (getResources()。openRawResource(R.raw.your_cert)) –

+0

你的意思是你的問題已經解決了,而不使用cert文件? – BNK

+0

是的,當我嘗試從我的iOS上使用基本設置沒有crt文件。 –