У меня есть приложение, использующее 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, обработчик для контекста отсутствует.
Кто-нибудь знает, что я пропускаю или делаю неправильно?