2012-08-08 7 views
8

Obecnie nadpisuję X509TrustManager, aby umożliwić wszystkim certyfikatom tymczasowe "rozwiązanie" (w tym przypadku niebezpieczne). Próbuję dowiedzieć się, w jaki sposób chciałbym dodać, aby zaakceptować tylko konkretny certyfikat, z którym mam problemy, aż do momentu, w którym można będzie naprawić poprawkę (co w tej chwili jest poza moim zasięgiem). Oto aktualny kod.X509TrustManager Override bez zezwolenia na WSZYSTKIE certyfikaty?

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

dlaczego zwraca zero zamiast pustej tablicy? specyfikacja mówi, że zwraca tablicę o wartości niezerowej. – Jayen

Odpowiedz

7

Wszystko, co musisz zrobić, to zwrócić certyfikat z getAcceptedIssuers. Zobacz this

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

a następnie powrócić że w tablicy w metodzie

+0

Czy mogę zwrócić certyfikat, który otrzymuję z adresu URL, z którym się łączę? W tej chwili dostaję tylko błędy certyfikatu podczas przechodzenia do innego adresu URL na innym serwerze, który podaje błędy certyfikatu. – user1015523

+0

To, co zrobiłem, to skorzystaj z przeglądarki, aby pobrać certyfikat z witryny za pomocą przeglądarki (gdy zobaczysz błąd, powinna być dostępna opcja w każdej większej przeglądarce, aby zapisać ją na dysku), a następnie dodaj ją do klucza przechowuj jak StephenC mówi lub użyj powyższego kodu z pliku. Powyższe rozwiązanie może być nieco mniej bolesne (aczkolwiek mniej elastyczne), ponieważ tworzenie magazynów kluczy IIRC jest nieco uciążliwe. – dfb

+1

Jeśli dostępny jest plik openssl, łańcuch certyfikatów można pobrać z wiersza poleceń: openssl s_client -host www.webservicehost.com -port 443 -showcerts> output_certificate.crt – IcedDante

0

Jedną z możliwości byłoby problematyczne tymczasowo dodać certyfikat do magazynu kluczy JVM jako zaufanego certyfikatu.