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-клиента?