我的组织有一个内部证书颁发机构(CA),我们已经生成了许多内部证书并安装在机器上。
我正在设置一个FreeIPA LDAP/Kerberos服务器,在初始安装之后,它已经生成了自己的内部CA,我可以在web界面中看到。
我想与现有组织的CA签署FreeIPA CA,以建立证书信任链。我正在跟踪用于手动更新外部签名的FreeIPA CA证书的IdM指令,我相信这包括用外部CA签署FreeIPA CA。这产生了一个CSR,我使用现有的CA进行签名以生成一个新的签名的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
'E=domains@digitalfruition.com,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证书,而不包含teh链的其余部分。我能够通过解压命令并在我的终端中重放它们来再现这个场景。这里是它崩溃的地方:
FreeIPA的ipa-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 'E=domains@digitalfruition.com,CN=ca.digitalfruition.com,OU=Internal CA,O=Digital Fruition\, LLC,L=Newland,ST=North Carolina,C=US' -f /tmp/tmppTphXX/pwdfile.txt
"E=CA@josh.gitlin.name,CN=Joshua Gitlin,OU=ca.josh.gitlin.name,O=Personal Certificate Authority,L=Newland,ST=North Carolina,C=US" [E=CA@josh.gitlin.name,CN=Joshua Gitlin,OU=ca.josh.gitlin.name,O=Personal Certificate Authority,L=Newland,ST=North Carolina,C=US]
"E=domains@digitalfruition.com,CN=ca.digitalfruition.com,OU=Internal CA,O=Digital Fruition\, LLC,L=Newland,ST=North Carolina,C=US" [E=domains@digitalfruition.com,CN=ca.digitalfruition.com,OU=Internal CA,O="Digital Fruition, LLC",L=Newland,ST=North Carolina,C=US]
因此,我认为这是certutil
的一个问题,但这是我目前为止所做的事情。
通过进一步调试,我决定certutil
不喜欢我生成的证书,所以这可能是CSR上的一个问题。其他的证书可以证明.
我做错什么了吗?用另一个内部CA签署FreeIPA证书颁发机构的正确方法是什么?
发布于 2019-06-15 09:13:03
我发现了问题。FreeIPA生成的CSR包括"X509v3授权密钥标识符“扩展设置为FreeIPA私钥的密钥ID。这导致certutil
认为CA是自签名的,并且不遵循证书链.
从FreeIPA签名CSR时,不要复制X509v3权限密钥标识符扩展。那么验证就会成功。
(另外:确保签名的CA证书使用UTF8编码主题名称;请参阅文档中的主题名称编码不匹配 )
https://serverfault.com/questions/970009
复制相似问题