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 证书颁发机构的正确方法是什么?
我发现了问题。FreeIPA 生成的 CSR 包括设置为 FreeIPA 私钥的密钥 ID 的“X509v3 授权密钥标识符”扩展。这会导致人们certutil相信 CA 是自签名的并且不遵循证书链。
从 FreeIPA 签署 CSR 时,请勿复制 X509v3 授权密钥标识符扩展。然后验证就会成功。
(另外:确保签名的 CA 证书使用 UTF8 来编码主题名称;请参阅文档中的主题名称编码不匹配)
| 归档时间: |
|
| 查看次数: |
828 次 |
| 最近记录: |