创建新的证书颁发机构,手动将 CA 链导入浏览器,并验证浏览器是否可以信任中介机构签名的新证书,我们将 CA 证书链(pem 和 crt 格式)复制到我们的 Ubuntu 服务器的以下目录下:
- /etc/ssl/证书/
- 在 /usr/local/share/ca-证书/
然而,完成此操作后,Ubuntu 计算机上的应用程序(例如 wget/curl/java)仍然不信任使用新证书的连接。根据另一篇帖子,我们需要在每台拥有证书的机器上运行dpkg-reconfigure -f noninteractive ca-certificates
或update-ca-certificates
。这些命令不仅不起作用,而且对数千台服务器运行它们也不切实际。我们使用 CFEngine 进行配置管理,但据我所知,它似乎没有这种功能。
有没有办法编写脚本来非交互地更新受信任的 CA 证书,以便可以对数千台机器起作用?
答案1
我同意 BillThor 提到的所有内容,但我要补充一点,可能需要完全重建证书存储,因为有时似乎 update-ca-certificates 太过懒惰,实际上并没有更新它应该更新的东西。
rm -f /usr/local/share/ca-certificates/certificate.crt
# --fresh is needed to remove symlinks to no-longer-present certificates
update-ca-certificates --fresh
另请注意,一旦 update-ca-certificates 完成,它应该已将文件符号链接到或/etc/ssl/certs/*.pem
中的相应证书。正如 BillThor 提到的,还会有一个以指纹为名称的文件的符号链接 - 它类似于。/usr/local/share/ca-certificates/
/usr/share/ca-certificates/
349f2832.0
ls -l 可以确认这一点:
--snip--
lrwxrwxrwx 1 root root 72 Feb 6 2014 Security_Communication_EV_RootCA1.pem -> /usr/share/ca-certificates/mozilla/Security_Communication_EV_RootCA1.crt
lrwxrwxrwx 1 root root 69 Mar 25 2014 Security_Communication_RootCA2.pem -> /usr/share/ca-certificates/mozilla/Security_Communication_RootCA2.crt
lrwxrwxrwx 1 root root 69 Feb 6 2014 Security_Communication_Root_CA.pem -> /usr/share/ca-certificates/mozilla/Security_Communication_Root_CA.crt
lrwxrwxrwx 1 root root 61 Feb 6 2014 Sonera_Class_1_Root_CA.pem -> /usr/share/ca-certificates/mozilla/Sonera_Class_1_Root_CA.crt
--snip--
另请注意,*.crt 和 *.pem 是同一个文件。这意味着放置的原始 .crt 应该是 .pem 格式。
.pem 格式的文件如下所示:
-----BEGIN CERTIFICATE-----
MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
--snip--
IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
O+7ETPTsJ3xCwnR8gooJybQDJbw=
-----END CERTIFICATE-----
您可以通过针对证书运行 openssl 来测试您的证书安装:
openssl x509 -in /etc/ssl/certs/[certname].pem -noout -text
并且
openssl x509 -in /usr/local/share/ca-certificates/[certname].pem -noout -text
(当然替换 [certname])
您应该会看到有关您的证书的一些详细信息,并且两者应该匹配(因为通过符号链接它们应该是同一个文件)。
如果不匹配,那么你应该重新运行update-ca-certificates --fresh
如果它们根本没有输出有用的信息,那么您需要检查您的证书并确保它是有效的 PEM 格式。
编辑:BillThor 提到这不适用于 Java,但至少在 Debian 上,Java 的证书存储似乎也通过 update-ca-certificates 工具保持最新。除了 Wine 运行 Adobe Air 应用程序之外,我不知道 Linux 上还有其他东西使用替代证书存储。
答案2
类似这样的工具update-ca-certificates
可确保证书通过与证书哈希值匹配的符号链接链接到。使用部署证书时cfengine
,我会在复制证书后添加一个添加符号链接的步骤。我发现这比在安装证书时运行程序更简单。
Java 使用cacerts
位于安装目录中的文件。您需要安装新cacerts
文件或将证书导入cacerts
文件。或者,您也可以jssecacerts
在现有文件旁边安装一个文件cacerts
。对于任一文件,您都需要确保文件包含您想要信任的所有证书。这可能是默认集的子集。最简单、最稳定的选项是在默认 Java 版本中安装文件。cacerts
随着各个证书颁发机构更新其公共信任证书,证书会定期更新,因此您需要随着时间的推移维护此文件。
根据您使用的浏览器,您可能需要将证书作为受信任的证书安装到浏览器的密钥库中,而该密钥库可能不是已经讨论过的任何一个密钥库。