2014-06-26 1 views
0

J'essaye de charger un BKS avec HttpsUrlConnection et avec le code suivant cela a fonctionné, cependant il a cassé la validation CA de CA par défaut avec mes autres serveurs.Chargement du certificat auto-signé à HttpsUrlConnection par défaut CA validation par défaut

try { 
    TrustManagerFactory tmf = TrustManagerFactory 
      .getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
    KeyStore ks = KeyStore.getInstance("BKS"); 
    InputStream in = ctw.getResources() 
      .openRawResource(R.raw.bks); 
    ks.load(in, "password".toCharArray()); 
    in.close(); 
    tmf.init(ks); 
    TrustManager[] tm = tmf.getTrustManagers(); 

    KeyManagerFactory kmf = KeyManagerFactory 
      .getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
    kmf.init(ks, "password".toCharArray()); 

    SSLContext sc = SSLContext.getInstance("SSL"); 
    sc.init(kmf.getKeyManagers(), tm, null); 

    HttpsURLConnection 
      .setDefaultHostnameVerifier(new HostnameVerifier() { 

       @Override 
       public boolean verify(String hostname, 
         SSLSession session) { 
        return true; 
       } 
      }); 

    HttpsURLConnection 
      .setDefaultSSLSocketFactory(sc.getSocketFactory()); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

L'erreur que je reçois est:

com.android.volley.NoConnectionError: 
javax.net.ssl.SSLHandshakeException: 
java.security.cert.CertPathValidatorException: 
Trust anchor for certification path not found. 

J'utilise la bibliothèque Volley pour les demandes de réseau. Mon code est-il erroné ou devrais-je modifier la bibliothèque Volley?

Merci.

Répondre

3

Ce que j'ai fait était de créer un CompositeTrustManager qui pourrait vérifier plusieurs sources, un certificat auto-signé et les autorités de certification par défaut. C'est caché derrière the TrustManagerBuilder API dans my CWAC-Security library. Vous utiliser le code:

new TrustManagerBuilder(this) 
    .selfSigned(R.raw.bks, "password".toCharArray()) 
    .or() 
    .useDefault(); 

puis appelez build() pour obtenir le TrustManager[] qui gère à la fois votre certificat auto-signé et la valeur par défaut CA. En l'état, votre code est en remplacement de le stock TrustManager[] dont un est lié à votre magasin BKS.

Une autre approche consiste à intercepter l'échec et à réessayer avec une connexion qui manque votre TrustManager[] personnalisé.

Questions connexes