2011-07-13 24 views
6

Próbuję utworzyć przykładowe projekty Java, które łączą się z samopodpisanym serwerem HTTPS. Nie mogę sprawić, że Java przestanie próbować sprawdzać poprawność certyfikatu. Nie chcę ufać temu certyfikatowi, chcę po prostu zignorować wszystkie walidacje certyfikatów; ten serwer znajduje się w mojej sieci i chcę mieć możliwość uruchamiania niektórych aplikacji testowych bez obawy, czy certyfikat jest ważny.Sprawdzanie poprawności certyfikatu Java ignore

java -Dcom.sun.net.ssl.checkRevocation=false HelloWorld 
org.apache.axis2.AxisFault: Connection has been shutdown: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

-Dcom.sun.net.ssl.checkRevocation = false nie pomogło. Próbowałem też dodając następujący kod:

public static void DisableCertificateValidation() { 
    TrustManager[] trustAllCerts = new TrustManager[]{ 
    new X509TrustManager() { 
     public X509Certificate[] getAcceptedIssuers() { return null; } 
     public void checkClientTrusted(X509Certificate[] certs, String authType) { } 
     public void checkServerTrusted(X509Certificate[] certs, String authType) { } 
    } 
    }; 
    try { 
    SSLContext sc = SSLContext.getInstance("SSL"); 
    sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
    } catch (Exception e) { 
    } 
} 

Ale nadal mam ten sam problem. Co tu się dzieje?

+0

Czy udało Ci się zignorować certyfikat z osią2? Josip – cromorrissey

Odpowiedz

10

org.apache.axis2.AxisFault wskazuje, że używasz Osi 2 i Osi 2 nie stosuje HttpsURLConnection aby jego HTTP (S) połączenia, ale Apache HttpClient (3.x o ile wiem), więc nie będzie miał HttpsURLConnection.setDefaultSSLSocketFactory(...) efekt tam.

Można spojrzeć na this answer o ustanowienie SSLContext dla osi 2, a dokładniej ten dokument: http://axis.apache.org/axis2/java/core/docs/http-transport.html#httpsupport

(Alternatywnie, może być w stanie uciec z domyślnym ustawieniem SSLContext z SSLContext.setDefault(...) wprowadzony w Javie 6. Wyłączenie weryfikacji certyfikatu dla twojego domyślnego kontekstu SSL nie jest oczywiście dobrym pomysłem w prawdziwej aplikacji.)

+0

Ahh, więc Axis2 nie używa HttpsUrlConnection, to wiele wyjaśnia! Erm ... Wciąż nie jestem pewien, jak skonfigurować SSLContext tutaj, rodzaj przytłaczającej ilości dokumentacji, z którą mam problem, ponieważ jakoś wydaje mi się, że powinien to być prosty przełącznik gdzieś. –

+0

Rzeczywiście, dodanie "SSLContext.setDefault (sc)" z wartością 'SSLContext.getInstance (" TLS ")' (lub 'SSLContext.getInstance (" SSL ")'?) Wydaje się działać tutaj. – sehe

3

To jest starsze pytanie, ale natknąłem się na to i to sprawiło, że znalazłem się we właściwym kierunku. mogę uzyskać dostęp do adresu URL https w axis2 bez ważnego certyfikatu klienta poprzez ustawienie params:

import org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory; 
import org.apache.commons.httpclient.protocol.Protocol; 

EasySSLProtocolSocketFactory easySSLProtocolSocketFactory; 
try { 
    easySSLProtocolSocketFactory = new EasySSLProtocolSocketFactory(); 
    Protocol.unregisterProtocol("https"); 
    Protocol.registerProtocol("https", new Protocol("https", 
        (ProtocolSocketFactory) easySSLProtocolSocketFactory, 443)); 
} 
catch (GeneralSecurityException e) { 
     e.printStackTrace(); 
} 

prostu należy to zrobić przed wywołaniem klienta usługi oś2. Nie jest to nic, co robiłbym w produkcji, ale jako szybki hack dla niezabezpieczonego serwera, który mi pomógł.

Powiązane problemy