2012-04-02 2 views
2

Ich benutze NetBeans 7.0.1, um eine Anwendung zu entwickeln, die mit einem Server/Webservice über gesicherte (HTTPS/SSL) SOAP kommunizieren kann. In NetBeans klicken Sie einfach auf "Neu" -> "Web Service Client ...", wählen Sie eine WSDL-Datei und klicken Sie dann auf Fertig stellen. Dies erzeugt einen Quellcode für den SOAP-Client. Danach habe ich viele neue java-Dateien in einem eigenen Ordner:Java SOAP Client JAX-WS: Wie man ein Zertifikat verwendet

Generated Sources (jax-ws) 

ich die WSDL-Datei geändert, um mich/localhost zu verbinden, ohne HTTPS/SSL, um die SOAP-Clients zu testen und es scheint gut zu funktionieren , aber jetzt muss ich ein spezielles Zertifikat für die SOAP/HTTP-Verbindung verwenden, das ich als .p12-Datei bekommen habe.

Ich weiß nicht, wie man ein Zertifikat in Kombination mit den generierten Quellen verwendet. Ich benutze den generierten SOAP-Clients wie folgt aus:

SoapServiceExample SSA = new ClassSoapServiceExample(); 
Object Response = SSA.getServicePort().doSomething(Authentification, Data); 

Wenn ich versuche, die SOAP-Clients mit der unveränderten/korrekte wsdl-Datei zu verwenden, ich diesen Fehler:

com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 

[com.sun.xml.internal.ws.transport.http.client.HttpClientTransport] [getOutput] [-1] 
[com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe] [process] [-1] 
[com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe] [processRequest] [-1] 
[com.sun.xml.internal.ws.transport.DeferredTransportPipe] [processRequest] [-1] 
[com.sun.xml.internal.ws.api.pipe.Fiber] [__doRun] [-1] 
[com.sun.xml.internal.ws.api.pipe.Fiber] [_doRun] [-1] 
[com.sun.xml.internal.ws.api.pipe.Fiber] [doRun] [-1] 
[com.sun.xml.internal.ws.api.pipe.Fiber] [runSync] [-1] 
[com.sun.xml.internal.ws.client.Stub] [process] [-1] 
[com.sun.xml.internal.ws.client.sei.SEIStub] [doProcess] [-1] 
[com.sun.xml.internal.ws.client.sei.SyncMethodHandler] [invoke] [-1] 
[com.sun.xml.internal.ws.client.sei.SyncMethodHandler] [invoke] [-1] 
[com.sun.xml.internal.ws.client.sei.SEIStub] [invoke] [-1] 
[$Proxy31] [doSomething] [-1] 

Im bereits in der Lage um ein .p12-Zertifikat zu laden, um es für einen Socket zu verwenden.

public static TrustManager[] createTrustManagerWhoTrustAllways() 
{ 
    return new TrustManager[] 
    { 
     new X509TrustManager() 
     { 
      @Override 
      public X509Certificate[] getAcceptedIssuers() 
      { 
       return null; 
      } 

      @Override 
      public void checkClientTrusted(X509Certificate[] certs, String authType) 
      { 
       return; 
      } 

      @Override 
      public void checkServerTrusted(X509Certificate[] certs, String authType) 
      { 
       return; 
      } 
     } 
    }; 
} 

public static SSLContext loadPkcs12CertificateAndGetSslContext(String FileName, String Password) throws Exception 
{ 
    KeyStore KS = KeyStore.getInstance("PKCS12"); 
    KS.load(new FileInputStream(FileName), Password.toCharArray()); 

    KeyManagerFactory KMF = KeyManagerFactory.getInstance("SunX509"); 
    KMF.init(KS, Password.toCharArray()); 

    SSLContext SSLC = SSLContext.getInstance("TLS"); 
    SSLC.init(KMF.getKeyManagers(), createTrustManagerWhoTrustAllways(), new SecureRandom()); 

    return SSLC; 
} 

public void connect() throws Exception 
{ 
    if(true == m_Secure) 
    { 
     SSLContext SSLC = loadPkcs12CertificateAndGetSslContext(m_CertificateFileName, m_CertificatePassword); 

     m_Socket = SSLC.getSocketFactory().createSocket(m_ServerName, m_ServerPort); 
    } 
    else 
    { 
     m_Socket = new Socket(m_ServerName, m_ServerPort); 
    } 
} 

Ich weiß/denke, das ist nicht gut geschrieben Quelle und ich glaube, seine schreckliche Praxis Sachen wie createTrustManagerWhoTrustAllways() zu verwenden, aber ich bin neu zu Java und mein erstes Ziel ist es, einen Arbeits Client zu produzieren, wenn ich Wenn ich diese Hürde genommen habe, werde ich mich auf einen sichereren Quellcode konzentrieren.

Kann mir jemand sagen, wie ich ein Zertifikat für den generierten SOAP-Client verwende?

Antwort

1

Sie können durch die Bereitstellung der Schlüsselspeicher und Trusts Konfiguration über die Systemeigenschaften in der Befehlszeile des Programms eine systemweite Schlüsselspeicher erklären:

-Djavax.net.ssl.trustStore=<yourtruststore> 
-Djavax.net.ssl.trustStorePassword=<pwd> 
-Djavax.net.ssl.keyStore=<your-keystore> 
-Djavax.net.ssl.keyStorePassword=<pwd> 

JAX-WS abholt diesen Schlüsselspeicher des SSL-Client konfigurieren Verbindung. Stellen Sie nur sicher, dass Sie die richtigen Zertifikate in Ihrem Keystore installiert haben.

Verwandte Themen