如何让 Ubuntu 以非交互方式信任新的根证书?

如何让 Ubuntu 以非交互方式信任新的根证书?

创建新的证书颁发机构,手动将 CA 链导入浏览器,并验证浏览器是否可以信任中介机构签名的新证书,我们将 CA 证书链(pem 和 crt 格式)复制到我们的 Ubuntu 服务器的以下目录下:

  • /etc/ssl/证书/
  • 在 /usr/local/share/ca-证书/

然而,完成此操作后,Ubuntu 计算机上的应用程序(例如 wget/curl/java)仍然不信任使用新证书的连接。根据另一篇帖子,我们需要在每台拥有证书的机器上运行dpkg-reconfigure -f noninteractive ca-certificatesupdate-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 运行 Adob​​e Air 应用程序之外,我不知道 Linux 上还有其他东西使用替代证书存储。

答案2

类似这样的工具update-ca-certificates可确保证书通过与证书哈希值匹配的符号链接链接到。使用部署证书时cfengine,我会在复制证书后添加一个添加符号链接的步骤。我发现这比在安装证书时运行程序更简单。

Java 使用cacerts位于安装目录中的文件。您需要安装新cacerts文件或将证书导入cacerts文件。或者,您也可以jssecacerts在现有文件旁边安装一个文件cacerts。对于任一文件,您都需要确保文件包含您想要信任的所有证书。这可能是默认集的子集。最简单、最稳定的选项是在默认 Java 版本中安装文件。cacerts随着各个证书颁发机构更新其公共信任证书,证书会定期更新,因此您需要随着时间的推移维护此文件。

根据您使用的浏览器,您可能需要将证书作为受信任的证书安装到浏览器的密钥库中,而该密钥库可能不是已经讨论过的任何一个密钥库。

相关内容