如何在“有效”证书中找到最终的 CA 证书

如何在“有效”证书中找到最终的 CA 证书

所以我管理两台网络服务器,一台旧的,一台新的。旧的使用我们的旧网址,新的使用我们的新网址,两者都是内部签名的。

旧证书上的 HTTPS 证书即将过期,因此我进行了检查,尽管它还剩 1 个月的时间,但由于它的证书颁发机构是内部计算机,因此它被识别为无效。
然而,具有类似内部签名证书的新服务器显示为有效,尽管它是由不同的内部机构签名的。

我正在努力弄清楚为什么新证书没问题,但旧证书却不好。要么新证书有一些我不知道的魔力(就像签名链中的最终父证书是我的 CA 中众所周知的证书之一,但当我询问 .crt 时它没有显示),或者签名链中不熟悉的(内部)父级 .crt 已添加到我的 ubuntu 客户端上的 ca 证书中。

我可以使用 ubuntu 桌面或 centos 客户端上的哪些 cli 命令来查找?如果新的 .crt 工作的原因是因为我的桌面上安装了证书,我如何找到该证书的安装位置(以及如何将其复制到其他 centos 计算机上)?

我试图openssl s_client -connect -showcerts识别两台服务器上的链,它们最终得到一个内部的签名机构 CN。我已经下载了证书并运行openssl verify -verbose -issuer_checks,但没有看到任何我认可的家长权限。我在 www.google.com 上运行了相同的操作,并且得到了熟悉的“GeoTrust Global CA”父级,因此我倾向于将内部父级权限添加到我的本地 ca 证书中,但我如何检查?

在所有情况下报告为最终权威的 CN 不是 DNS 名称,因此我无法从某个地方下载该 .crt,我所拥有的只是新 url .crt 中的内容,所以我可以openssl使用仅从 CN 查找证书(如果明显的父 .crt 不在我的本地 ca 证书中,则可能是 openssl 在内部执行此操作以得出其有效的结论)?

编辑:我认为主密钥已添加到我的 chrome (libnss3) 证书中。添加相同的主密钥需要什么,以便它受到 chrome 以外的支持(例如 cli 上的 php 和 openssl)

答案1

如果有人能想出更好的答案,请这样做,但我发现的最好的答案是:- http://manuals.gfi.com/en/kerio/connect/content/server-configuration/ssl-certificates/adding-trusted-root-certificates-to-the-server-1605.html

我在我的 ubuntu 桌面上发现这/usr/share/ca-certificates是证书的主要位置,但我正在寻找的位置是在/usr/local/share/ca-certificates.我通过使用find -iname "*<NAME>*"和搜索与我的钥匙链中的父主机名匹配的名称找到了它。

我还发现,虽然我桌面上的 Chrome 识别该证书有效,但某些 cli 工具(包括 openssl)却没有。因此,我在我们的文档中找到了对此命令的引用,以添加到libnss该命令显然是 chrome 用作 ca 权限的内容

certutil -d sql:${HOME}/.pki/nssdb/ -A -t "C,," \
         -n "<CERTIFICATE NAME>" \
         -i /usr/local/share/ca-certificates/<CERTIFICATE>.crt

上面的 gfi 链接包含一些关于在 ubuntu/centos 上管理 ca 证书的非常有用的内容。这是我为我们自己的内部维基抄写的东西:-

Linux(Ubuntu、Debian)

添加

  1. 将您的 CA 复制到目录/usr/local/share/ca-certificates/
  2. 使用命令:sudo cp foo.crt /usr/local/share/ca-certificates/foo.crt
  3. 更新 CA 存储:sudo update-ca-certificates

消除

  1. 删除您的 CA。
  2. 更新 CA 存储:sudo update-ca-certificates --fresh

Linux(CentOs 6)

添加

  1. 安装 ca 证书包:yum install ca-certificates
  2. 启用动态CA配置功能:update-ca-trust force-enable
  3. 将其作为新文件添加到/etc/pki/ca-trust/source/anchors/cp foo.crt /etc/pki/ca-trust/source/anchors/
  4. 使用命令:update-ca-trust extract

希望这可以节省别人查找资料的时间。

答案2

strace可以帮助您找出在哪里openssl找到最终验证服务器证书的可信 CA 证书:

$ strace -fe open,openat openssl s_client -connect www.google.com:443 > /dev/null
[...]
openat(AT_FDCWD, "/usr/lib/ssl/certs/1001acf7.0", O_RDONLY) = 4
depth=2 C = US, O = Google Trust Services LLC, CN = GTS Root R1
verify return:1
depth=1 C = US, O = Google Trust Services LLC, CN = GTS CA 1C3
verify return:1
depth=0 CN = www.google.com
verify return:1
read:errno=0
+++ exited with 0 +++
$ openssl x509 -noout -subject < /usr/lib/ssl/certs/1001acf7.0
subject=C = US, O = Google Trust Services LLC, CN = GTS Root R1
$ ls -l /usr/lib/ssl/certs/1001acf7.0
lrwxrwxrwx 1 root root 15 Oct 30  2020 /usr/lib/ssl/certs/1001acf7.0 -> GTS_Root_R1.pem
$ dpkg -S /usr/lib/ssl/certs/1001acf7.0(:P)
ca-certificates: /usr/share/ca-certificates/mozilla/GTS_Root_R1.crt

上面是 /usr/lib/ssl/certs/1001acf7.0,其中 1001acf7 是该证书主题的哈希值,这里是系统标准根 CA 列表的一部分((:P)用于获取规范绝对路径的 zsh glob 限定符)。

相关内容