RootCA 証明書が cacerts トラストストアにインポートされた後、JRE が AD との LDAPS 接続を確立できない

RootCA 証明書が cacerts トラストストアにインポートされた後、JRE が AD との LDAPS 接続を確立できない

LDAPS は、Windows および Linux システム上の ldp.exe および他の多くのプログラムを通じて動作しますが、ルート証明書はまったく必要ありません。JSSE を使用する一部のプログラムは、ルート CA と中間 CA を cacerts トラストストアにインポートした後、接続に失敗します。

NTDS\Personal (AD から) にある LDAPS 証明書を cacerts に直接インポートするテストを行いましたが、Java を使用する特定のアプリケーションでは、これによりセキュア LDAP が機能します。

Java を使用して失敗するプログラムでは、ルート証明書をインポートすると次のエラーが表示されます。

[ルート例外は javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX パス検証に失敗しました: java.security.cert.CertPathValidatorException: 署名チェックに失敗しました]

LDAPS 証明書をインポートすると、次のエラーが表示されることがあります:

[ルート例外は javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: 証明書がアルゴリズム制約に準拠していません]

(java.security をコメントアウトした後でも)

またはJRE を使用するプログラムによっては動作を開始しますが、共通の障害は、エラーに基づいて JRE が証明書チェーンを一般的に好まないように見えることです。

MY CDP/AIA は内部的に HTTP で利用可能であり、すべての証明書は信頼できるプライベート内部 2 層 Windows PKI によって署名されています。

openssl s_client -connect -showcerts domain:port

正しい証明書チェーンを返しますが、エラーも返します:

verify error:num=20:unable to get local issuer certificate

これは明らかに、openssl がルート証明書を認識しないことに関係しているため、-cafile追加情報を使用しても同じエラーが発生します。これは意味があるかもしれませんが、ルート証明書の証明書チェーン内のサムプリントは同じなので、-cafile正しいはずです...

この時点で、私は「Java で LDAPS を有効にする方法」の 70% が間違っている (確かにすべて互いに矛盾している) と思い始めており、ルート証明書を信頼するのではなく、実際の LDAPS 証明書をインポートする必要がある理由については、JAVA CAPS のルールの方が理にかなっていると思います。参考文献

編集: 回答を参照

これは私の証明書の構成の問題のように思えますか、それとも Java 固有の何か他のことが起こっているように思えますか?

答え1

PKI の設定に関しては、技術的にはすべて正しく行っていたことがわかりました。エラーは、証明書が RSASSA-PSS で署名されていたために発生しました。Java 1.8 は PKCS #1 v2.1 をサポートしていません。

ルートから発行CAまでの証明書チェーン全体を再生成する必要がありました。これにはCAPolicy.infの編集が必要でした。

AlternateSignatureAlgorithm=10

また、コマンドライン certutil -setreg ca\csp\alternatesignaturealgorithm 0

手動でも指定する必要がありました。

証明書の問題のように見えましたが、署名の互換性が問題になるとは思っていませんでした。教訓になりました。

関連号: Microsoft 証明機関プロバイダーの互換性

関連ソース: https://pkisolutions.com/pkcs1v2-1rsassa-pss/

関連情報