Openssl

如何使用我的組織內部 CA 簽署新的 FreeIPA 伺服器的內部 CA?

  • June 15, 2019

我的組織有一個內部證書頒發機構 (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_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))

在詳細模式下執行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 簽名,也不會列印整個鏈。當我在中間 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 對主題名稱進行編碼;請參閱文件中的主題名稱編碼不匹配

引用自:https://serverfault.com/questions/970009