2012-08-08 17 views
8

Ich überschreibe derzeit X509TrustManager, um alle Zertifikate als eine vorübergehende "Lösung" (eine unsichere) zu ermöglichen. Ich versuche herauszufinden, wie ich hinzufügen würde, so akzeptiert es nur ein bestimmtes Zertifikat, mit dem ich Probleme habe, bis eine angemessene Lösung gefunden werden kann (was mir momentan nicht möglich ist). Hier ist der aktuelle Code.X509TrustManager überschreiben, ohne ALL certs zuzulassen?

TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { 
    @Override 
    public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
     return null; 
    } 

    @Override 
    public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { 
    } 

    @Override 
    public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { 
    } 
}}; 

try { 
    SSLContext sc = SSLContext.getInstance("SSL"); 
    sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
} catch (GeneralSecurityException e) { 
    System.out.println(e.getStackTrace()); 
} 
+0

warum Null anstelle eines leeren Arrays zurückgeben? Die Spezifikation besagt, dass ein Array ungleich null zurückgegeben wird. – Jayen

Antwort

7

Alles, was Sie tun müssen, ist das Zertifikat von getAcceptedIssuers zurückgeben. Siehe this

InputStream inStream = new FileInputStream("fileName-of-cert"); 
CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream); 
inStream.close(); 

und dann wieder, dass in einer Reihe innerhalb des Verfahrens

+0

Kann ich ein Zertifikat zurückgeben, das ich von einer URL erhalten habe, mit der ich eine Verbindung herstelle? Momentan erhalte ich nur die Zertifikatfehler, wenn ich zu einer anderen URL auf einem anderen Server gehe, die dann die Zertifikatfehler gibt. – user1015523

+0

Was ich getan habe, ist einen Browser zu verwenden, um das Zertifikat von der Site per Browser herunterzuziehen (wenn Sie den Fehler sehen, sollte es in jedem großen Browser eine Option geben, um es auf Platte zu speichern) und dann entweder zum Schlüssel hinzufügen Speichern Sie wie StephenC sagt oder benutzen Sie den obigen Code aus der Datei. Die obige Lösung mag ein wenig weniger schmerzhaft (wenn auch weniger flexibel) sein, da IIRC-generierende Schlüsselspeicher ein wenig mühsam sind. – dfb

+1

Wenn openssl verfügbar ist, kann die Zertifikatskette über die Befehlszeile heruntergeladen werden: openssl s_client -host www.webservicehost.com -port 443 -showcerts> output_certificate.crt – IcedDante

0

Eine Möglichkeit vorübergehend sein würde, um das problematische Zertifikat auf JVM Schlüsselspeichern als gesichertes Zertifikat hinzufügen.

Verwandte Themen