私の組織には内部認証局(CA)があり、これはすでに多くの内部証明書を生成し、マシンにインストールしています。
私は FreeIPA LDAP/Kerberosサーバー をセットアップしています。最初のインストール後、それはそれ自体の内部CAを生成しました。これはWebインターフェースで確認できます。
証明書の信頼チェーンを確立するために、既存の組織のCAでFreeIPA CAに署名したいのですが。私は 外部署名されたIdM CA証明書を手動で更新するためのFreeIPAの指示 に従っており、外部IPを使用したFreeIPA CAへの署名をカバーしています。これにより、既存のCAを使用して署名したCSRが生成され、新しい署名済みFreeIPA CAが生成されました。
しかし、ipa-cacert-manage renew --external-cert-file
コマンドを使用して、新しく署名されたCA +証明書チェーンを再インポートしようとしてスタックしました。指示に従ってそれを実行すると、チェーン内の証明書の1つが欠落しているため、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
引数の1つで提供されました。また、「CAバンドル」ファイル(1つのファイルに複数の証明書)を試しましたが、結果は同じでした。
さらに掘り下げてみると、問題は実際には load_external_cert
in 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
を実行すると、チェーン内のすべての証明書が検出されますが、[art where 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]
ただし、証明書がトラストストアにある別のCAによって署名されていても、certutil
はチェーン全体を印刷していません。中間CAでcertutil
を呼び出すと、properチェーンが表示されることがわかります。
[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に何か問題がある可能性があります。他の証明書は問題なく検証されます...
私は何か間違ったことをしていますか? FreeIPA認証局に別の内部CAで署名する適切な方法は何ですか?
問題が見つかりました。 FreeIPAによって生成されたCSRには、FreeIPA秘密鍵の鍵IDに設定された「X509v3 Authority Key Identifier」拡張が含まれています。これにより、certutil
はCAが自己署名されており、証明書チェーンに従っていないと考えます。
FreeIPAからCSRに署名する場合、X509v3 Authority Key Identifier拡張機能をコピーしないでください。その後、検証は成功します。
(また、署名されたCA証明書がサブジェクト名のエンコードにUTF8を使用していることを確認してください。ドキュメントの サブジェクト名のエンコードの不一致 を参照してください)