我的组织有一个内部证书颁发机构 (CA),我们已经生成了许多内部证书并安装在机器上。
我正在设置一个FreeIPA LDAP/Kerberos 服务器,在初始安装后,它生成了它自己的内部 CA,我可以在 Web 界面中看到它。
我想与现有组织的 CA 签署 FreeIPA CA,以建立证书信任链。我正在遵循FreeIPA 手动更新外部签名 IdM CA 证书的说明,我相信这涵盖了使用外部 CA 签署 FreeIPA CA。这产生了一个 CSR,我使用现有的 CA 签署了该 CSR 以产生一个新的签署的 FreeIPA CA。
但是,我在尝试使用该ipa-cacert-manage renew --external-cert-file
命令重新导入新签名的 CA + 证书链时遇到了困难。当我按照说明运行它时,我收到一个错误,即 CA 证书链不完整,因为它缺少链中的一个证书:
[root@lockandkey ~]# ipa-cacert-manage renew --external-cert-file=/tmp/LockAndKey_FreeIPA_CA.crt --external-cert-file=/tmp/dfca.crt --external-cert-file=/tmp/jgca.crt
Importing the renewed CA certificate, please wait
CA certificate chain in /tmp/LockAndKey_FreeIPA_CA.crt,
/tmp/dfca.crt, /tmp/jgca.crt is incomplete: missing certificate with subject
'[email protected],CN=ca.digitalfruition.com,OU=Internal CA,O=Digital Fruition\, LLC,L=Newland,ST=North Carolina,C=US'
The ipa-cacert-manage command failed.
但是,该证书是在其中一个--external-cert-file
论点中提供的。我还尝试了一个“CA Bundle”文件(一个文件中有多个证书),结果是一样的。
进一步挖掘,问题实际上似乎来自load_external_cert
installutils.py
trust_chain = list(reversed(nssdb.get_trust_chain(ca_nickname)))
ca_cert_chain = []
for nickname in trust_chain:
cert, subject, issuer = cache[nickname]
ca_cert_chain.append(cert)
if subject == issuer:
break
else:
raise ScriptError(
"CA certificate chain in %s is incomplete: "
"missing certificate with subject '%s'" %
(", ".join(files), issuer))
在详细模式下运行ipa-cacert-manage renew
表明它确实找到了链中的所有证书,但是当它到达 [艺术trust_chain
形成的地方,trust_chain
仅包含 FreeIPA 证书而不包含链的其余部分。我能够通过展开命令并在终端中重放它们来重现场景。这是它崩溃的地方:
FreeIPAipa-cacert-manage renew
正在使用该选项调用certutil
“打印证书链” -O
,如下所示:
[root@lockandkey ~]# /usr/bin/certutil -d dbm:/tmp/tmppTphXX -O -n 'CN=Certificate Authority,O=FARCRY.SITEPALETTE.COM' -f /tmp/tmppTphXX/pwdfile.txt
"CN=Certificate Authority,O=FARCRY.SITEPALETTE.COM" [CN=Certificate Authority,O=FARCRY.SITEPALETTE.COM]
但是certutil
,即使证书由信任库中的另一个 CA 签名,也不会打印整个链。当我在中间 CA 上调用它时,您可以看到它certutil
确实显示了正确的链:
[root@lockandkey ~]# /usr/bin/certutil -d dbm:/tmp/tmppTphXX -O -n '[email protected],CN=ca.digitalfruition.com,OU=Internal CA,O=Digital Fruition\, LLC,L=Newland,ST=North Carolina,C=US' -f /tmp/tmppTphXX/pwdfile.txt
"[email protected],CN=Joshua Gitlin,OU=ca.josh.gitlin.name,O=Personal Certificate Authority,L=Newland,ST=North Carolina,C=US" [[email protected],CN=Joshua Gitlin,OU=ca.josh.gitlin.name,O=Personal Certificate Authority,L=Newland,ST=North Carolina,C=US]
"[email protected],CN=ca.digitalfruition.com,OU=Internal CA,O=Digital Fruition\, LLC,L=Newland,ST=North Carolina,C=US" [[email protected],CN=ca.digitalfruition.com,OU=Internal CA,O="Digital Fruition, LLC",L=Newland,ST=North Carolina,C=US]
所以我相信这是一个问题certutil
,但这是我到目前为止所得到的。
进一步调试我已经决定由于某种原因certutil
不喜欢我生成的证书,所以这可能是该 CSR 上的问题。其他证书验证良好...
难道我做错了什么?与另一个内部 CA 签署 FreeIPA 证书颁发机构的正确方法是什么?
我发现了问题。FreeIPA 生成的 CSR 包括设置为 FreeIPA 私钥的密钥 ID 的“X509v3 Authority Key Identifier”扩展。这导致
certutil
人们相信 CA 是自签名的,并且不遵循证书链。从 FreeIPA 签署 CSR 时,请勿复制 X509v3 授权密钥标识符扩展。然后验证将成功。
(另外:确保签名的 CA 证书使用 UTF8 对主题名称进行编码;请参阅文档中的主题名称编码不匹配)