如何使用我组织的内部 CA 签署新的 FreeIPA 服务器的内部 CA?

如何使用我组织的内部 CA 签署新的 FreeIPA 服务器的内部 CA?

我的组织有一个内部证书颁发机构(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 编码主题名称;请参阅主题名称编码不匹配在文档中)

相关内容