2017-07-27 4 views
0

J'essaie d'utiliser l'épinglage de certificat sur Android avec Retrofit. J'essaie d'évaluer un certificat signé Verisign valide.L'épinglage du certificat échoue même avec un certificat signé par l'autorité de certification

je reçois l'erreur suivante:

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

Pourquoi ne peut pas le certificat Pinner pas évalué contre le CA des certs de racine de l'appareil? N'a-t-il pas accès à la confiance de l'appareil? Ou peut-être que l'approbation de périphérique ne contient pas toute la chaîne de certificats. Mais alors pourquoi ma communication SSL échoue-t-elle?

// 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(); 

Répondre

0

J'ai trouvé la réponse. Je peux obtenir l'approbation Root comme indiqué ci-dessous et l'utiliser dans l'appel sslSocketFactory. Cela a fonctionné pour moi.

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

Pensez à donner OkHttp le certificat Pinner et le gestionnaire de la confiance. Autrement OkHttp doit rechercher le gestionnaire de confiance avec la réflexion et c'est plus lent. –