Клиент Java SOAP JAX-WS: Как использовать сертификат - PullRequest
2 голосов
/ 02 апреля 2012

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

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]

Я уже в состоянии загрузить сертификат .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?-client

1 Ответ

1 голос
/ 12 июня 2012

Вы можете объявить хранилище ключей для всей системы, указав конфигурацию хранилища ключей и доверенных сертификатов через системные свойства в командной строке вашей программы:

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

JAX-WS подберет это хранилище ключей для настройки соединения клиента SSL. Просто убедитесь, что у вас есть нужные сертификаты в вашем хранилище ключей.

...