2017-12-28 16 views
0

Wenn ich das Apache-Paket commons-httpclient-3.1.jar verwende, versuche ich die folgende Logik zu verwenden, um eine SSL-Zertifizierung zu vermeiden.Wie ignoriere ich die SSL-Zertifizierung bei der Verwendung von org.apache.commons.httpclient?

TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() { 
       public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
        return null; 
       } 
       public void checkClientTrusted(X509Certificate[] certs, String authType) { 
       } 
       public void checkServerTrusted(X509Certificate[] certs, String authType) { 
       } 
      } 
     }; 

     // Install the all-trusting trust manager 
     SSLContext sc = SSLContext.getInstance("SSL"); 
     sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
     HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 

     // Create all-trusting host name verifier 
     HostnameVerifier allHostsValid = new HostnameVerifier() { 
      public boolean verify(String hostname, SSLSession session) { 
       return true; 
      } 
     }; 

     // Install the all-trusting host verifier 
     HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); 

aber leider bekam ich noch Fehler: die Https-Client-Zertifikat-Authentifizierung Fehler: "javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX Pfad Gebäude fehlgeschlagen: sun.security.provider .certpath.SunCertPathBuilderException "

Dann wähle ich httpclient-4.3.3.jar, die obige Logik funktioniert nicht so gut, aber wenn die untenstehende Logik hinzugefügt wird, funktioniert es.

httpClient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", socketFactory, 443)); 

Httpclient die Instanz von DefaultHttpClient ist, wird durch Socket initialisiert:

SSLContext ctx = SSLContext.getInstance("TLS"); 
    ctx.init(null, new TrustManager[] { xtm }, null); 
    SSLSocketFactory socketFactory = new SSLSocketFactory(ctx); 
    socketFactory.setHostnameVerifier(hostnameVerifier);    

Es scheint, dass Scheme Register Muss.

aber für Paket commons-httpclient-3.1.jar, wie das Schema-Register zu tun?

danke im voraus!

Antwort

0

nach der Untersuchung kann der folgende Weg die Anforderung erfüllen.

Protocol easyhttps = new Protocol("https", (ProtocolSocketFactory)new EasySSLProtocolSocketFactory(), 443); 
Protocol.registerProtocol("https", easyhttps); 

EasySSLProtocolSocketFactory ist im Paket commons-Httpclient-contrib-3.1.jar

Verwandte Themen