LDAPSは、ldp.exeと、ルート証明書を必要としないように見えるWindowsおよびLinuxシステム上の他の多くのプログラムを介して機能しています。まったく。 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層WindowsPKIによって署名されています。
openssl s_client -connect -showcerts domain:port
正しい証明書チェーンを返しますが、エラーも返します。
verify error:num=20:unable to get local issuer certificate
これは明らかにopensslがルート証明書を認識していないことに関連しているため、-cafile
の補遺があっても同じエラーが発生します。これは、ルート証明書の証明書チェーンの拇印が-cafile
と同じであるため、そうあるべきだと思われます。正しい...
この時点で、すべての「JavaでLDAPSを有効にする方法」の70%が間違っている(それらはすべて確かに互いに矛盾している)、そしてJava = CAPSは、ルート証明書を信頼するだけでなく、実際のLDAPS証明書をインポートする必要がある理由を理解します。 https://docs.Oracle.com/cd/E19509-01/820-3399/ ggfrj/index.html
編集:回答を参照
それで、それは私の証明書の構成の問題のように聞こえますか、それとも何か他のもののように聞こえますかJava特定が起こっているのですか?
PKIの設定に関して、技術的にすべて正しいことを行ったことがわかりました。エラーは、証明書がRSASSA-PSSで署名されていたことが原因でした。 Java 1.8はPKCS#1v2.1をサポートしていません。
ルートから発行CAまでの証明書チェーン全体を再生成する必要がありました。これにはCAPolicy.infの編集が必要でした
AlternateSignatureAlgorithm=1
から0
また、コマンドラインcertutil -setreg ca\csp\alternatesignaturealgorithm 0
手動で指定する必要もあります。
証明書の問題のように見えましたが、署名の互換性が問題になるとは思いもしませんでした。学んだ教訓。
関連する問題: Microsoft認証局プロバイダーの互換性