首先,我已将 Tomcat8 配置为 https,并在连接器 xml 文件中链接了有效的证书。
像这样:
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true" maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" enableLookups="false" keyAlias="https"
keystoreFile="C:\Program Files\Apache Software Foundation\Tomcat 8.0\conf\keystore.jks"
keystorePass="changeit"/>
但我需要我的 Web 应用程序作为客户端连接到具有有效证书的第三方数据提供商。我应该把这个额外的证书放在哪里?当我将密钥库放入连接器时,“https”证书不是第一个证书,这会破坏一些东西。我可能可以使用keyAlias
连接器中的属性来解决这个问题...
但是...连接器密钥库是否适用于整个应用程序?这种设置的最佳选择是什么?
这文章基本上总结了我的选择,选哪一个?最好的选择似乎是将包含两个证书的密钥库传递给 JVM,但如何告诉连接器使用哪个证书?
编辑:
现在我得到:
Wrapped javax.net.ssl.SSLHandshakeException:
sun.security.validator.ValidatorException:
PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
Cause: sun.security.validator.ValidatorException: PKIX path building
failed: sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target]
答案1
在我们的环境(tomcat7)中,如果我们使用 java 密钥库,那么我们的连接器如下所示:
<Connector SSLEnabled="true"
acceptCount="100"
connectionTimeout="20000"
executor="tomcatThreadPool"
keyAlias="tomcat"
keystoreFile="${catalina.base}/conf/tomcat.keystore"
keystorePass="changeme"
maxKeepAliveRequests="15"
port="443"
protocol="org.apache.coyote.http11.Http11Protocol"
redirectPort="8443"
scheme="https"
secure="true"/>
差异在于${catalina.base}
(在我们的案例中/选择/ tomcat /) 而不是 ${user.home}/
,正如您所提到的keyAlias
。
如果您想要将密钥导入密钥库,可以这样做(当 tomcat 作为客户端在 ADFS 上进行身份验证时,我们会使用它):
keytool -importcert -file cert.cer -keystore tomcat.keystore -alias myalias
我认为使用密钥库${catalina.base}
您keyAlaias
应该能够解决您的问题。
答案2
最后,我创建了一个密钥库(使用 Windows 上的密钥库资源管理器),其中包含所有必要的证书(密钥)和别名。然后我将密钥库和 trustore 填写为 Java VM 启动参数:
-Djavax.net.ssl.keyStore=%KEYSTORE%
-Djavax.net.ssl.keyStorePassword=changeme
-Djavax.net.ssl.trustStore=%TRUSTSTORE%
-Djavax.net.ssl.trustStorePassword=changeme
在 tomcat 连接器中使用相同的密钥库,并使用适合 HTTPS 的 keyAlias。
在调试时启用它-Djava.net.debug=ssl
也非常有用。