web-dev-qa-db-ja.com

組織の内部CAで新しいFreeIPAサーバーの内部CAに署名するにはどうすればよいですか?

私の組織には内部認証局(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 renewcertutilを呼び出し、次のように-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で署名する適切な方法は何ですか?

5
Josh

問題が見つかりました。 FreeIPAによって生成されたCSRには、FreeIPA秘密鍵の鍵IDに設定された「X509v3 Authority Key Identifier」拡張が含まれています。これにより、certutilはCAが自己署名されており、証明書チェーンに従っていないと考えます。

FreeIPAからCSRに署名する場合、X509v3 Authority Key Identifier拡張機能をコピーしないでください。その後、検証は成功します。

(また、署名されたCA証明書がサブジェクト名のエンコードにUTF8を使用していることを確認してください。ドキュメントの サブジェクト名のエンコードの不一致 を参照してください)

2
Josh