2012-09-18 14 views
13

Jak wyłączyć sprawdzanie poprawności certyfikatu w kliencie JAX-WS przy użyciu javax.xml.ws.Service?Jak wyłączyć sprawdzanie poprawności certyfikatu w kliencie JAX-WS?

Próbowałem tworzenia wszystko ufając TrustManager w SSLSocketFactory i starał się powiązać go z BindingProvider

SSLContext sc = SSLContext.getInstance("SSL"); 
sc.init(null, trustAllCerts, new java.security.SecureRandom()); 

Map<String, Object> ctxt = ((BindingProvider) wsport).getRequestContext(); 
ctxt.put(JAXWSProperties.SSL_SOCKET_FACTORY, sc.getSocketFactory()); 

ale wciąż coraz Exception: unable to find valid certification path to requested target

Ale to działa, kiedy po prostu użyć

HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 

Czy jest jakiś sposób, aby utworzyć javax.xml.ws.Service użyć utworzonego HttpsURLConnection?

+4

Kontekst jest ważne. Dlaczego chcesz celowo wprowadzić poważną niepewność? Jeśli nie chcesz, aby było bezpieczne, po co w ogóle korzystać z HTTPS/SSL? – EJP

+3

Lepiej byłoby dodać niezaufany certyfikat do magazynu kluczy Java – artbristol

Odpowiedz

15

znalazłem rozwiązanie tutaj: http://schrepfler.blogspot.com.br/2009/06/relaxing-ssl-validation-for-jaxws.html

Używam tego rozwiązania wywołując dwie statyczne metody na statycznym bloku przy głównej klasy, na przykład:

static { 
    SSLUtilities.trustAllHostnames(); 
    SSLUtilities.trustAllHttpsCertificates(); 
} 

Hope this helps

+7

Bravo. Przerwij SSL/TLS dla wszystkich połączeń z tej maszyny JVM. :( –

+0

jesteście dobrzy !! – tom

7

prawda może być znalezione w blogu Erik Wramner tu http://erikwramner.wordpress.com/2013/03/27/trust-self-signed-ssl-certificates-and-skip-host-name-verification-with-jax-ws

Proszę zwrócić uwagę także dla komentarza Nikolay Smirnova. Używam jdk 7 i glassfish 3.1.2. W tym środowisku sugerowane rozwiązanie działa idealnie, jeśli serwer zajmuje się autodeklarowanym certyfikatem.

I obejmuje cały roztwór w celu późniejszego wykorzystania również w tym roztworze, gdy apache cxf stosuje się:

// import com.sun.xml.ws.developer.JAXWSProperties; 
import java.security.GeneralSecurityException; 
import java.security.SecureRandom; 
import java.util.Map; 
import javax.net.ssl.HostnameVerifier; 
import javax.net.ssl.KeyManager; 
import javax.net.ssl.SSLContext; 
import javax.net.ssl.SSLSession; 
import javax.net.ssl.SSLSocketFactory; 
import javax.net.ssl.TrustManager; 
import javax.net.ssl.X509TrustManager; 
import javax.xml.ws.BindingProvider; 
import org.apache.cxf.configuration.jsse.TLSClientParameters; 
import org.apache.cxf.endpoint.Client; 
import org.apache.cxf.frontend.ClientProxy; 
import org.apache.cxf.transport.http.HTTPConduit; 

/** 
* 
* Usage examples (BindingProvider port): 
* NaiveSSLHelper.makeWebServiceClientTrustEveryone(port); // GlassFish 
* NaiveSSLHelper.makeCxfWebServiceClientTrustEveryone(port); // TomEE 
* 
* Based on Erik Wramner's example frome here: 
* http://erikwramner.wordpress.com/2013/03/27/trust-self-signed-ssl-certificates-and-skip-host-name-verification-with-jax-ws/ 
* 
* I have extended the functionality when Apache CXF is used. 
*/ 
public class NaiveSSLHelper { 

    private static final String JAXWS_HOSTNAME_VERIFIER = "com.sun.xml.ws.transport.https.client.hostname.verifier"; // JAXWSProperties.HOSTNAME_VERIFIER; 
    private static final String JAXWS_SSL_SOCKET_FACTORY = "com.sun.xml.ws.transport.https.client.SSLSocketFactory"; // JAXWSProperties.SSL_SOCKET_FACTORY; 

    // In Glassfish (Metro) environment you can use this function (Erik Wramner's solution) 
    public static void makeWebServiceClientTrustEveryone(Object webServicePort) { 
     if (webServicePort instanceof BindingProvider) { 
      BindingProvider bp = (BindingProvider) webServicePort; 
      Map requestContext = bp.getRequestContext(); 
      requestContext.put(JAXWS_SSL_SOCKET_FACTORY, getTrustingSSLSocketFactory()); 
      requestContext.put(JAXWS_HOSTNAME_VERIFIER, new NaiveHostnameVerifier()); 
     } else { 
      throw new IllegalArgumentException(
        "Web service port " 
        + webServicePort.getClass().getName() 
        + " does not implement " 
        + BindingProvider.class.getName()); 
     } 
    } 

    // In TomEE (Apache CXF) environment you can use this function (my solution) 
    public static void makeCxfWebServiceClientTrustEveryone(Object port) { 
     TrustManager[] trustManagers = new TrustManager[]{ 
      new NaiveTrustManager() 
     }; 
     Client c = ClientProxy.getClient(port); 
     HTTPConduit httpConduit = (HTTPConduit) c.getConduit(); 
     TLSClientParameters tlsParams = new TLSClientParameters(); 
     tlsParams.setSecureSocketProtocol("SSL"); 
     tlsParams.setKeyManagers(new KeyManager[0]); 
     tlsParams.setTrustManagers(trustManagers); 
     tlsParams.setDisableCNCheck(true); 
     httpConduit.setTlsClientParameters(tlsParams); 
    } 

    public static SSLSocketFactory getTrustingSSLSocketFactory() { 
     return SSLSocketFactoryHolder.INSTANCE; 
    } 

    private static SSLSocketFactory createSSLSocketFactory() { 
     TrustManager[] trustManagers = new TrustManager[]{ 
      new NaiveTrustManager() 
     }; 
     SSLContext sslContext; 
     try { 
      sslContext = SSLContext.getInstance("SSL"); 
      sslContext.init(new KeyManager[0], trustManagers, new SecureRandom()); 
      return sslContext.getSocketFactory(); 
     } catch (GeneralSecurityException e) { 
      return null; 
     } 
    } 

    private static interface SSLSocketFactoryHolder { 

     public static final SSLSocketFactory INSTANCE = createSSLSocketFactory(); 
    } 

    private static class NaiveHostnameVerifier implements 
      HostnameVerifier { 

     @Override 
     public boolean verify(String hostName, 
       SSLSession session) { 
      return true; 
     } 
    } 

    private static class NaiveTrustManager implements 
      X509TrustManager { 

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

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

     @Override 
     public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
      return new java.security.cert.X509Certificate[0]; 
     } 
    } 
} 
+1

Znacznie lepiej niż odpowiedź Jose Renato Rozwiązanie z linku mówi, że nie działa we wszystkich przypadkach, ale przynajmniej dla mnie (z OpenJdk 1.8, i jakiejkolwiek implementacji JAX-WS NetBeans 8.2 używa) działało dobrze. Czy skopiowałbyś go tutaj, aby chronić przed potencjalnym przyszłym zniknięciem połączonej strony? – pvgoran

+1

Dodałem rozwiązanie samodzielnie w oparciu o sugestię @pvgoran .Zawierałem również przypadek, gdy ApacheCXF jest używany. –

Powiązane problemy