如何使用我的組織內部 CA 簽署新的 FreeIPA 伺服器的內部 CA?
我的組織有一個內部證書頒發機構 (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.
但是,該證書是在其中一個
--external-cert-file
論點中提供的。我還嘗試了一個“CA Bundle”文件(一個文件中有多個證書),結果是一樣的。進一步探勘,問題實際上似乎來自
load_external_cert
installutils.pytrust_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 證書而不包含鏈的其餘部分。我能夠通過展開命令並在終端中重放它們來重現場景。這是它崩潰的地方: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 證書頒發機構的正確方法是什麼?
我發現了問題。FreeIPA 生成的 CSR 包括設置為 FreeIPA 私鑰的密鑰 ID 的“X509v3 Authority Key Identifier”擴展。這導致
certutil
人們相信 CA 是自簽名的,並且不遵循證書鏈。從 FreeIPA 簽署 CSR 時,請勿複制 X509v3 授權密鑰標識符擴展。然後驗證將成功。
(另外:確保簽名的 CA 證書使用 UTF8 對主題名稱進行編碼;請參閱文件中的主題名稱編碼不匹配)