我的组织有一个内部证书颁发机构(CA),我们已经生成了许多内部证书并已安装在机器上。
我正在建立一个FreeIPA LDAP/Kerberos 服务器初始安装后,它生成了自己的内部 CA,我可以在 Web 界面中看到它。
我想使用现有组织的 CA 签署 FreeIPA CA,以建立证书信任链。我正在关注FreeIPA 手动更新外部签名 IdM CA 证书的说明我相信这涵盖了使用外部 CA 签署 FreeIPA CA。这生成了一个 CSR,我使用现有 CA 对其进行了签名,以生成新的已签名 FreeIPA CA。
但是,我在尝试使用该命令重新导入新签名的 CA + 证书链时遇到了ipa-cacert-manage renew --external-cert-file
问题。当我按照说明运行该命令时,出现错误,提示 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 签名的,也不会打印整个链。您可以看到确实certutil
显示了恰当的当我在中间 CA 上调用它时,链:
[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 证书颁发机构的正确方法是什么?
答案1
我找到了问题所在。FreeIPA 生成的 CSR 包含设置为 FreeIPA 私钥密钥 ID 的“X509v3 授权密钥标识符”扩展。这导致certutil
人们认为 CA 是自签名的,并且不遵循证书链。
从 FreeIPA 签署 CSR 时,不要复制 X509v3 Authority Key Identifier 扩展。然后验证就会成功。
(另外:确保签名的 CA 证书使用 UTF8 编码主题名称;请参阅主题名称编码不匹配在文档中)