Установите для SSLSocketFactory вызов веб-службы JAX-WS в Weblogic 12c - PullRequest
0 голосов
/ 15 октября 2018

Мне нужно вызвать внешнюю конечную точку веб-службы через HTTPS, используя сертификат SSL.Правильный путь должен заключаться в настройке пользовательского SSLSocketFactory с использованием BindingProvider, но я не могу заставить его работать.Чтобы заставить соединение работать, я должен установить SSLSocketFactory по умолчанию:

 public void secureStoreSignedOffPdf(String filename, byte[] signedOffPdf, URL endpoint, String applicationEnvironmentId) {
    final SSLSocketFactory defaultSslSocketFactory = HttpsURLConnection.getDefaultSSLSocketFactory();
    final SSLSocketFactory wsSslSocketFactory = SslHelper.buildWebServiceSslSocketFactory(applicationEnvironmentId);
    // TODO Fix: this should work only setting the property with BindingProvider (see below)
    HttpsURLConnection.setDefaultSSLSocketFactory(wsSslSocketFactory);

    final StoragePortService storagePortService = new StoragePortService();
    final StoragePort storagePort = storagePortService.getStoragePortSoap11();

    final BindingProvider bindingProvider = (BindingProvider) storagePort;
    bindingProvider.getRequestContext()
                   .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpoint.toString());
    bindingProvider.getRequestContext()
                   .put("com.sun.xml.ws.transport.https.client.SSLSocketFactory", wsSslSocketFactory);

    final StorageRequest storageRequest = new StorageRequest();
    final Document document = new Document();
    document.setContent(new DataHandler(new ByteArrayDataSource(signedOffPdf, PDF_CONTENT_TYPE)));
    document.setName(filename);

    storageRequest.setOverwrite(true);
    storageRequest.setBaseDocument(document);
    final StorageResponse storageResponse = storagePort.storage(storageRequest);
    HttpsURLConnection.setDefaultSSLSocketFactory(defaultSslSocketFactory);
    if (!storageResponse.getReturnCode()
                        .equalsIgnoreCase(RESPONSE_OK)) {
        throw new IllegalStateException("Web service failed with error: "
                                                + storageResponse.getReturnCode()
                                                + " - "
                                                + storageResponse.getReturnMessage());
    }
}

Если я удалю эту строку:

bindingProvider.getRequestContext().put("com.sun.xml.ws.transport.https.client.SSLSocketFactory", wsSslSocketFactory);

Код все еще работает (потому что я использую HttpsURLConnection.метод setDefaultSSLSocketFactory).Но если в этой строке я поставил неправильный SSLSocketFactory, он завершится неудачей, поэтому это означает, что установка атрибута factory делает что-то.

То, что я не получаю, - это вызов, работающий без установки SSLSocketFactory по умолчанию:

HttpsURLConnection.setDefaultSSLSocketFactory(...)

К вашему сведению: я уже пробовал с:

bindingProvider.getRequestContext().put("com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory", wsSslSocketFactory);

, но он ничего не делает.

...