将整个证书链加载到 Tomcat 7 的密钥库中

将整个证书链加载到 Tomcat 7 的密钥库中

环境:Windows 2008 R2 上的 Tomcat 7.0

要完成什么

让 Tomcat 7.0 使用带有随附证书链的特定通配符证书,这样客户的浏览器就不会抛出错误。提供的证书是通配符证书。这是不可协商的,与安装证书无关。

我的问题是,除了主证书之外,我无法让 tomcat 使用链(根证书)。

我尝试过的方法

一开始,我花了很长时间才让证书与提供的密钥对一起工作。参考文献 2 和 3 向我展示了以下步骤,将提供的密钥对导入为 Tomcat 更喜欢的“PrivateKeyEntry”:

#on a CentOS server cuz easier than getting a windows tool for it
openssl pkcs12 -export -in wildcard-customer-2016.crt -inkey wildcard-customer-2016.key -out wildcard-customer-2016.p12 -name wildcard -CAfile rapidssl.crt -caname root

#back on windows
C:\Program Files\Java\jre7\bin\keytool -importkeystore -deststorepass tomcat -destkeystore c:\.keystore -srckeystore c:\certificate\wildcard-customer-2016\wildcard-customer-2016.p12 -srcstoretype PKCS12 -alias wildcard

但我不知道如何添加根证书以便它也使用它。您可以看到我用于构建 .p12 文件的命令包含一个 CAfile 命令。使用“-trustcacerts”运行 importkeystore 命令时不会添加根证书,尽管它确实适用于 *.customer.com 证书。

可能的替代方案
有人能解释一下如何配置server.xml才能正确使用 APR 吗?假设我不知道 zip 文件中的文件放在哪里。(参考文献 4)

参考

  1. https://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html
  2. https://stackoverflow.com/questions/906402/importing-an-existing-x509-certificate-and-private-key-in-java-keystore-to-use-i
  3. http://cunning.sharp.fm/2008/06/importing_private_keys_into_a.html
  4. 使用 .key、.ca 和 .cert 文件为 tomcat 创建 jks

答案1

我使用以下步骤来实现这一点

  1. 包含未加密私钥的 HOSTNAME.key
  2. HOSTNAME.cer 包含公共证书 + CA 链。

$HOSTNAME 应该是主机的 FQDN(对于别名而言,在步骤 2 和 3 中很重要)。

openssl pkcs12 \
  -export \
  -out   $HOSTNAME.pfx \
  -inkey $HOSTNAME.key \
  -in    $HOSTNAME.cer

然后使用 $HOSTNAME.pfx

keytool -importkeystore \
  -srckeystore   $HOSTNAME.pfx \
  -srcstoretype  pkcs12 \
  -srcstorepass  pazzword \
  -destkeystore  $HOSTNAME.jks \
  -deststoretype JKS \
  -deststorepass pazzword \
  -srcalias      1 \
  -destalias     $HOSTNAME

最后在 Tomcat 的 server.xml 中

keystoreFile="/etc/tomcat7/security/$HOSTNAME.jks"
keystorePass="pazzword"
keyAlias="$HOSTNAME"
truststoreFile="/etc/tomcat7/security/mastercert.jks" 
truststorePass="changeit"

最后一部分(信任库)是如果您需要 Tomcat 信任额外的 CA,那么在您的设置中可能不需要它。因此,密钥库是服务器证书所在的位置,信任库是服务器将信任的对象(如果您想要进行相互认证等)。

相关内容