2017-07-27 5 views
0

AndroidでRetrofitで証明書のピン割り当てを使用しようとしています。 Verisignが署名した有効な証明書を評価しようとしています。CA署名付き証明書でも証明書のピン割り当てが失敗する

私は次のエラーを取得する:

HTTP FAILED: javax.net.ssl.SSLPeerUnverifiedException: Failed to find a trusted cert that signed Certificate.

なぜ証明書ピンナは、デバイスのCAルート本命に対して評価できないことはできませんか?デバイスの信頼にアクセスできないのですか?または、デバイスの信頼に証明書チェーン全体が含まれていない可能性があります。しかし、なぜ私のSSL通信が失敗しないのですか?

// Pin Certificate 
CertificatePinner certificatePinner = new CertificatePinner.Builder() 
     .add("www.mydomain.com", "sha256/somerandompublickeystring") 
     .build(); 

// To handle self-signed cert 
OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder(); 

OkHttpClient client = clientBuilder.connectTimeout(120, TimeUnit.SECONDS) 
     .writeTimeout(120, TimeUnit.SECONDS) 
     .readTimeout(120, TimeUnit.SECONDS) 
     .certificatePinner(certificatePinner) 
     .build(); 

答えて

0

答えを見つけました。以下に示すように、ルートの信頼を保持し、sslSocketFactory呼び出しでそれを使用できます。これは私のために働いた。

OkHttpClient client = clientBuilder.connectTimeout(120, TimeUnit.SECONDS) 
     .writeTimeout(120, TimeUnit.SECONDS) 
     .readTimeout(120, TimeUnit.SECONDS) 
     .sslSocketFactory(getSystemDefaultSSLSocketFactory(app)) 
     .certificatePinner(certificatePinner) 
     .build(); 

private static SSLSocketFactory getSystemDefaultSSLSocketFactory(Application app) { 
    SSLContext sslContext = null; 
    try 
    { 
     TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
       TrustManagerFactory.getDefaultAlgorithm()); 
     trustManagerFactory.init((KeyStore) null); 
     TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); 
     if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) { 
      throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers)); 
     } 
     sslContext = SSLContext.getInstance("TLS"); 
     sslContext.init(null, trustManagers, null); 

    } 
    catch(Exception ex) 
    { 
     Log.e("TAG",ex.getMessage()); 
    } 
    return sslContext.getSocketFactory(); 

}

+0

証明ピンナーおよびトラストマネージャの両方をOkHttp与え検討。さもなければ、OkHttpはリフレクションを使ってトラストマネージャをルックアップする必要があり、それは遅くなります。 –

関連する問題