2012-01-01 3 views
1

J'essaie de faire fonctionner DefaultHttpClient() avec certificat SSL expiré.Comment accepter un certificat ssl expiré avec le client Apache?

Android API 2.2 

Il ne compilera pas à cause de cette ligne:

SSLSocketFactory sf = new SSLSocketFactory (SSLContext);

Erreur: The constructor SSLSocketFactory(SSLContext) est pas défini

Qu'est-ce que je fais mal?

import javax.net.ssl.SSLContext; 
    import javax.net.ssl.TrustManager; 
    import javax.net.ssl.X509TrustManager; 
    import org.apache.http.conn.ssl.SSLSocketFactory; 
    {...} 

     SSLContext sslContext = SSLContext.getInstance("SSL"); 

     // set up a TrustManager that trusts everything 
     sslContext.init(null, new TrustManager[] { new X509TrustManager() { 
        public X509Certificate[] getAcceptedIssuers() { 
          System.out.println("getAcceptedIssuers ============="); 
          return null; 
        } 

        public void checkClientTrusted(X509Certificate[] certs, 
            String authType) { 
          System.out.println("checkClientTrusted ============="); 
        } 

        public void checkServerTrusted(X509Certificate[] certs, 
            String authType) { 
          System.out.println("checkServerTrusted ============="); 
        } 
     } }, new SecureRandom()); 

     SSLSocketFactory sf = new SSLSocketFactory(sslContext); 
     Scheme httpsScheme = new Scheme("https", sf, 443); 
     SchemeRegistry schemeRegistry = new SchemeRegistry(); 
     schemeRegistry.register(httpsScheme); 

     HttpParams params = new BasicHttpParams(); 
     ClientConnectionManager cm = new SingleClientConnManager(params, schemeRegistry); 

     //DefaultHttpClient httpclient = new DefaultHttpClient(); 
     DefaultHttpClient httpclient = new DefaultHttpClient(cm, params); 
+0

Indépendamment de la façon de passer ce 'SSLContext' au client HTTP, ce que vous faites mal, c'est que vous utilisez un gestionnaire de confiance qui ne fait rien pour vérifier le certificat du serveur. Ces gestionnaires de confiance pass-through laisseront * tout * certificat (y compris ceux provenant de MITM potentiel), pas seulement ceux en qui vous avez confiance mais qui ont expiré. – Bruno

Répondre

1

En regardant à travers la documentation SSLSocketFactory, il ne semble pas être un constructeur:

SSLSocketFactory(javax.net.ssl.SSLContext) 

Les constructeurs disponibles sont:

SSLSocketFactory(String algorithm, KeyStore keystore, String keystorePassword, KeyStore truststore, SecureRandom random, HostNameResolver nameResolver) 
SSLSocketFactory(KeyStore keystore, String keystorePassword, KeyStore truststore) 
SSLSocketFactory(KeyStore keystore, String keystorePassword) 
SSLSocketFactory(KeyStore truststore) 

Suis-je manque quelque chose ici?

Voir aussi javax.net.ssl.SSLContext

0

Vous n'avez pas fait quelque chose de mal (sauf peut-être en utilisant un code Java standard).

Il semble que la mise en œuvre de la classe Android Apache SSLSocketFactory ne met pas en œuvre tous les constructeurs de la classe d'origine Apache SSLSocketFactory

Vous aurez juste à improviser.

Questions connexes