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

MrD*_*Coy 8 automation ssl ubuntu

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

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

然而,一旦完成,Ubuntu 机器上的应用程序(如 wget/curl/java)仍然不信任使用新证书的连接。根据另一篇文章,我们需要在拥有证书的每台机器上运行dpkg-reconfigure -f noninteractive ca-certificatesupdate-ca-certificates。这些命令不仅不起作用,而且在数千台服务器上运行它们也是不切实际的。我们使用 CFEngine 进行配置管理,但据我所知,它似乎没有这种功能。

有没有办法编写 Ubuntu 脚本以非交互式更新受信任的 CA 证书,这种方式可以在数千台机器上运行?

sto*_*her 9

我同意 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
Run Code Online (Sandbox Code Playgroud)

另请注意,一旦 update-ca-certificates 完成,它应该已将/etc/ssl/certs/*.pem文件符号链接到/usr/local/share/ca-certificates/或 中的相应证书/usr/share/ca-certificates/。正如 BillThor 所提到的,还会有一个指向以指纹为名称的文件的符号链接 - 它类似于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--
Run Code Online (Sandbox Code Playgroud)

还要注意 *.crt 和 *.pem 是同一个文件。这意味着放置的原始 .crt 应该是 .pem 格式。

.pem 格式文件如下所示:

-----BEGIN CERTIFICATE-----
MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
--snip--
IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
O+7ETPTsJ3xCwnR8gooJybQDJbw=
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

您可以通过对证书运行 openssl 来测试您的证书安装: openssl x509 -in /etc/ssl/certs/[certname].pem -noout -textopenssl x509 -in /usr/local/share/ca-certificates/[certname].pem -noout -text (当然替换 [certname])

您应该会看到有关您的证书的一些广泛信息,并且两者都应该匹配(因为带有符号链接,它们应该是同一个文件)。

如果它们不匹配,那么你应该重新运行 update-ca-certificates --fresh

如果他们根本不输出有用的信息,那么您需要检查您的证书并确保它采用有效的 PEM 格式。

编辑:BillThor 提到这不适用于 Java,但至少在 debian 上似乎,Java 的证书存储也由 update-ca-certificates 工具保持最新。除了运行 Adob​​e Air 应用程序的 Wine 之外,我不知道 Linux 上还有其他使用替代证书存储的东西。