2012-04-02 4 views
2

Im, использующий NetBeans 7.0.1 для разработки приложения, которое может связываться с сервером/веб-сервисом через защищенный (HTTPS/SSL) SOAP. В NetBeans я просто нажимаю «Новый» -> «Клиент веб-сервиса ...», выберите wsdl-файл и затем нажмите «Готово». Это создаст исходный код для SOAP-клиента. После этого, у меня есть много новых Java-файлов в собственной папке:Java SOAP Client JAX-WS: использование сертификата

Generated Sources (jax-ws) 

Я изменил WSDL-файл для подключения к себе/локальный без HTTPS/SSL для тестирования SOAP-клиент и, кажется, работает хорошо , но теперь мне нужно использовать специальный сертификат для SOAP/HTTP-соединения, который я получил как .p12-файл.

Я не знаю, как использовать сертификат в сочетании с сгенерированными источниками. Я использую сгенерированный SOAP-клиент, как это:

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

Если я пытаюсь использовать SOAP-клиент с неизмененным/правильным WSDL-файлом, я получаю эту ошибку:

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 уже способную загрузить сертификат .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 подключение. Просто убедитесь, что у вас есть правильные сертификаты в вашем хранилище ключей.