web-dev-qa-db-ja.com

Windows証明書をJava

JavaサーバーがSSLを介して外部Ldapサーバーに接続しようとしています(クエリを実行するためのクライアントとして)。

接続時に送信される証明書はローカルWindowsのトラストストアでのみ信頼されていますが、Javaトラストストア(cacerts)には存在しないため、接続に問題があります。

Windowsが信頼する証明書を信頼するようにJavaに指示する方法はありますか?

または、代わりに、すべての信頼できる証明書をWindowsトラストストアからJavaのcacertsにインポートする方法はありますか?

任意のアイデアをいただければ幸いです。

10
Yoaz Menda

Windowsが信頼する証明書を信頼するようにJavaに指示する方法はありますか?

いいえ、jre/lib/security/cacertsでJVMのデフォルトを使用するか、独自のトラストストアを設定する必要があります。

System.setProperty ("javax.net.ssl.trustStore", path_to_your_trustore_jks_file);
System.setProperty ("javax.net.ssl.trustStorePassword", "password");

すべての信頼できる証明書をWindowsトラストストアからJavaのcacertsにインポートする方法はありますか?

自動プロセスはありませんが、Windows証明書ストアから信頼できる機関を抽出し、アプリケーションで使用するように構成されたトラストストアにインポートするプログラムを構築できます(cacertsの変更はお勧めしません)

//Read Windows truststore
KeyStore ks = KeyStore.getInstance("Windows-ROOT");
ks.load(null, null) ;
3
pedrofb

解決

Windowsでは、次のJVMプロパティを設定します。

javax.net.ssl.trustStore=NUL
javax.net.ssl.trustStoreType=Windows-ROOT

自己署名CAを信頼する64ビットWindowsインストールで実行されるJava7でこれを正常にテストしました。

セキュリティプロバイダーの構成

上記の解決策がうまくいく場合(そうすべきです)、このセクションをスキップできます。それ以外の場合は、 Java Cryptography Extension (JCE)のセットアップを確認してください。これは 最新のJDKにバンドルされています 。 JDKインストールには、セキュリティプロバイダーのリストを含むプロパティファイルが必要です。そのファイルの場所は、Javaバージョンによって異なる場合があります。鉱山は"%Java_HOME%\jre\lib\security\Java.security"にあります。そのファイル内で、名前がsecurity.providerで始まるプロパティのセットを見つけます。それらのエントリの1つをSun.security.mscapi.SunMSCAPIに設定する必要があります。

実行時にプロパティを設定するには、次のJavaコードを使用します。

System.setProperty("javax.net.ssl.trustStore", "NUL");
System.setProperty("javax.net.ssl.trustStoreType", "Windows-ROOT");

説明

javax.net.ssl.trustStoreType

Windowsでは、Javaには SunMSCAPI が付属しています。これは、実際には ラッパーであるセキュリティプロバイダーです。 Windows CAPI。

javax.net.ssl.trustStoreTypeプロパティをWindows-ROOTに設定すると、Javaは、ルートCAを含む信頼できる証明書のネイティブWindowsROOTキーストアを参照するように指示されます。 (同様に、javax.net.ssl.keyStoreTypeWindows-MYに設定すると、ユーザー固有の証明書とそれに対応するキーについて、ネイティブのWindows MYキーストアを参照するようにJavaに指示されます)。

javax.net.ssl.trustStore

javax.net.ssl.trustStoreTypeプロパティがWindows-ROOTに設定されている場合、javax.net.ssl.trustStoreの値は無視され、eに設定できることが期待されます。 g。 NONE一部のユーザーは、このアプローチは機能しないと報告しています。

この問題の一般的な回避策の1つは、javax.net.ssl.trustStoreNONEに設定してから、ファイル名がNONEのダミーファイルを作成することです。この癖の影響を受けていることに気付いた場合は、javax.net.ssl.trustStoreNULに設定してみてください。そうすれば、ダミーファイルを作成する必要がなくなります。

18
Synoli