我的Wildfly 10.0.0.Final上正在运行的后台进程需要使用Axis连接到Web服务。在远程服务器上,有一个自签名证书,我使用openssl将其导入到信任库中,以从远程服务器获取证书,他们使用keytool创建信任库并将证书导入到其中。
我将Wildfly 10.0.0.Final的standalone.xml设置如下:
<security-realm name="SSLRealm">
<server-identities>
<ssl>
<keystore path="keystore.jks" relative-to="jboss.server.config.dir"
keystore-password="mykeystorepassword" alias="myalias"
key-password="mykeypass" />
</ssl>
</server-identities>
<authentication>
<truststore path="truststore.jks" relative-to="jboss.server.config.dir"
keystore-password="mytruststorepassword" />
</authentication>
</security-realm>
<server name="default-server">
<http-listener name="default" socket-binding="http" redirect-socket="https" />
<https-listener name="default-ssl" security-realm="SSLRealm" socket-binding="https" />
<host name="default-host" alias="localhost">
<location name="/" handler="welcome-content" />
</host>
</server>
但仍然,当后台进程尝试连接到远程服务时,我得到以下异常:
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.build(Unknown Source)
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
at java.security.cert.CertPathBuilder.build(Unknown Source)
任何想法如何解决这个问题?似乎没有使用信任库或类似的东西...
最佳答案
我有同样的问题,只能通过将参数添加到wildfly的启动脚本中来解决:
-Djavax.net.ssl.trustStore = foo.jks
-Djavax.net.ssl.trustStorePassword = bar
当然,它会覆盖默认的cacerts。
但是我不清楚为什么似乎忽略了安全领域中定义的信任库。