问题描述
创建新的certificate authority,手动将CA链导入浏览器并验证浏览器可以信任通过中介签名的新证书后,我们将CA证书链(pem和crt格式化)复制到以下目录的Ubuntu服务器中:
-
/etc /ssl /certificates /
-
/usr /local /share /ca-certificates /
但是,一旦完成此操作,Ubuntu机器上的应用程序(例如wget /curl /java)仍然不信任使用新证书的连接。根据another post,我们需要在具有证书的每台计算机上运行dpkg-reconfigure -f noninteractive ca-certificates
或update-ca-certificates
。这些命令不仅不起作用,而且在数千台服务器上运行它们也是不切实际的。我们使用CFEngine进行配置管理,但是据我所知,它似乎没有针对这种情况的工具。
有没有一种方法可以使Ubuntu脚本化,从而以可以对数千台计算机起作用的方式非交互地更新受信任的CA证书?
最佳回答
我同意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
文件符号链接到其在/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--
另请注意,*。crt和* .pem是同一文件。这意味着放置的原始.crt应该为.pem格式。
.pem格式的文件如下所示:
-----BEGIN CERTIFICATE-----
MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
--snip--
IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
O+7ETPTsJ3xCwnR8gooJybQDJbw=
-----END CERTIFICATE-----
您可以通过对证书运行opensl来测试证书的安装:openssl x509 -in /etc/ssl/certs/[certname].pem -noout -text
和openssl x509 -in /usr/local/share/ca-certificates/[certname].pem -noout -text
(当然替换为[certname])
您应该看到有关证书的一些详细信息,并且两者都应该匹配(因为使用符号链接,它们应该是同一文件)。
如果它们不匹配,那么您应该re-run update-ca-certificates --fresh
如果他们根本不输出有用的信息,那么您需要检查您的证书并确保其为有效的PEM格式。
编辑:BillThor提到这不适用于Java,但似乎至少在debian上,update-ca-certificates工具也使Java的证书存储保持最新。除了可能运行Wine的Adobe Air之外,我不知道Linux上使用替代证书存储的其他功能。