HTTPS для веб-служб JAX-WS без обработчика для контекста - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть приложение, использующее Grails, которое предоставляет веб-службы через org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter:

<bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter">
    <property name="baseAddress" value="http://0.0.0.0:8091/api/"/>
</bean>

Я настроил HTTPS для этих веб-служб, следуя этому руководству http://www.codeghost.co.uk/post/50912832626/https-with-java-6-web-services, и вот мой полученный код:

<bean class="org.springframework.remoting.jaxws.SimpleHttpServerJaxWsServiceExporter">
    <property name="server" ref="httpsServer" />
    <property name="basePath" value="/api/" />
</bean>

<!-- HTTPS Server -->
<bean id="httpsServer" class="com.sun.net.httpserver.HttpsServer" factory-method="create" init-method="start" autowire="byName">
    <constructor-arg ref="httpsServerSocket" />
    <constructor-arg value="0"/>
</bean>

<!-- HTTPS Server Socket -->
<bean id="httpsServerSocket" class="java.net.InetSocketAddress">
    <constructor-arg value="0.0.0.0"/>
    <constructor-arg value="8092"/>
</bean>

<!-- HTTPS Configurator -->
<bean id="httpsConfigurator" class="com.sun.net.httpserver.HttpsConfigurator">
    <constructor-arg ref="sslContext"/>
</bean>

<bean id="sslContext" class="com.application.config.HttpsConfigurator" factory-method="getSSLContext">
    <constructor-arg value="${keystore.filename}" />
    <constructor-arg value="${keystore.password}" />
    <constructor-arg value="${keystore.cryptstore.password}" />
</bean>

com.application.config.HttpsConfigurator.getSSLContext () является следующим:

public static SSLContext getSSLContext(String keyStoreName,
                                       String keyStorePassword, String cryptStorePassword) throws Exception {
    KeyStore keyStore = KeyStore.getInstance("JKS");
    keyStore.load(new FileInputStream(keyStoreName),
            keyStorePassword.toCharArray());

    KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
    keyManagerFactory.init(keyStore, cryptStorePassword.toCharArray());

    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
    trustManagerFactory.init(keyStore);

    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);

    return sslContext;
}

Если я запускаю приложение с помощью команды run-app Grails, я могу получить доступ к веб-службам по адресу https://localhost:8092/api/service?wsdl,, но при развертывании войны на Tomcat тот же адрес возвращает 500 Internal Server Error, никакого обработчика для контекста. Это конфигурация без редактирования файла Tomcat server.xml.

Я попытался запустить Tomcat, используя эту конфигурацию HTTPS в файле server.xml, но я получил исключение из приложения, поскольку адрес (https://localhost:8092) уже используется:

<Connector port="8092" protocol="org.apache.coyote.http11.Http11Protocol"
    maxThreads="200" scheme="https" secure="true" SSLEnabled="true"
    keystoreFile="${user.home}/.keystore" keystorePass="password"
    clientAuth="false" sslProtocol="TLS" />

Если я изменю порт на другой, результатом всегда будет 500 Internal Server Error, обработчик для контекста отсутствует.

Кто-нибудь знает, что я пропускаю или делаю неправильно?

...