web-dev-qa-db-ja.com

RootCA証明書がcacertsトラストストアにインポートされた後、JREはADとのLDAPS接続の確立に失敗します

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特定が起こっているのですか?

4
Phatmandrake

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

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

AlternateSignatureAlgorithm=1から0

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

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

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

関連する問題: Microsoft認証局プロバイダーの互換性

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

5
Phatmandrake