当应用程序作为客户端时,应该将证书放在 Tomcat 中的哪里?

当应用程序作为客户端时,应该将证书放在 Tomcat 中的哪里?

首先,我已将 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也非常有用。

相关内容