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

Jos*_*osh 5 openssl certificate-authority freeipa certutil

我的组织有一个内部证书颁发机构 (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 
'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.
Run Code Online (Sandbox Code Playgroud)

但是,该证书在其中一个--external-cert-file论据中提供的。我还尝试了“CA Bundle”文件(一个文件中有多个证书),结果是一样的。

进一步挖掘,问题实际上似乎来自load_external_certinstallutils.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))
Run Code Online (Sandbox Code Playgroud)

ipa-cacert-manage renew在详细模式下运行表明它确实找到了链中的所有证书,但是当它到达 [art wheretrust_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]
Run Code Online (Sandbox Code Playgroud)

但是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]
Run Code Online (Sandbox Code Playgroud)

所以我相信这是一个问题certutil,但这是到目前为止我所得到的。

进一步调试这个我已经决定由于某种原因certutil不喜欢我生成的证书,所以它可能是该 CSR 上的某个问题。其他证书验证正常...

难道我做错了什么?使用另一个内部 CA 签署 FreeIPA 证书颁发机构的正确方法是什么?

Jos*_*osh 2

我发现了问题。FreeIPA 生成的 CSR 包括设置为 FreeIPA 私钥的密钥 ID 的“X509v3 授权密钥标识符”扩展。这会导致人们certutil相信 CA 是自签名的并且不遵循证书链。

从 FreeIPA 签署 CSR 时,请勿复制 X509v3 授权密钥标识符扩展。然后验证就会成功。

(另外:确保签名的 CA 证书使用 UTF8 来编码主题名称;请参阅文档中的主题名称编码不匹配)