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=1
に0
また、コマンドライン
certutil -setreg ca\csp\alternatesignaturealgorithm 0
手動でも指定する必要がありました。
証明書の問題のように見えましたが、署名の互換性が問題になるとは思っていませんでした。教訓になりました。