2012-04-02 17 views
2

Im NetBeans 7.0.1を使用して、セキュアな(HTTPS/SSL)SOAPを介してサーバー/ Webサービスと通信できるアプリケーションを開発します。 NetBeansでは、単に「新規」 - >「Webサービスクライアント...」をクリックし、wsdl-fileを選択してから「終了」をクリックします。これにより、SOAPクライアントのソースコードが生成されます。その後、私は自分のフォルダに多くの新しいJavaファイルを持っている:Java SOAPクライアントJAX-WS:証明書の使用方法

Generated Sources (jax-ws) 

私はSOAPクライアントをテストするために、HTTPS/SSLせずに自分自身/ローカルホストに接続するには、WSDLファイルを変更し、うまく機能しているようですしかし、今私はSOAP/HTTP接続のための特定の証明書を使用する必要があります。私は.p12ファイルとして取得します。

生成されたソースと組み合わせて証明書を使用する方法はわかりません。私はこのように生成されたSOAPクライアントを使用します。

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] 

イムことができ、すでに:

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

私は変わらず/正しいWSDLファイルとSOAPクライアントを使用しようとすると、私はこのエラーを取得しますそれをソケット用に使用する.p12証明書をロードします。

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); 
    } 
} 

私は/このよく書かれていないソースを推測知っていると私はその恐ろしい練習がcreateTrustManagerWhoTrustAllways()のようなものを使用しますが、Javaに新しいイムすると信じて、私の最初の目標は、私が持っている場合は、作業クライアントを生成することですこのハードルを私はより安全なソースコードに集中します。

誰でも私に、生成されたSOAPクライアントの証明書をどのように使用するのか教えていただけますか?

答えて

1

あなたはあなたのプログラムのコマンドラインでシステムプロパティを通じてキーストアとトラストストアの構成を提供することにより、システム全体のキーストアを宣言することができます。

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

JAX-WSは、SSLクライアントを設定するには、このキーストアをピックアップします接続。キーストアに正しい証明書があることを確認してください。

関連する問題