Java SSLおよび証明書キーストア


165

Javaプログラムは、証明書を含むキーストアの場所をどのようにして知るのですか?または、キーストアを探す場所をJavaプログラムにどのように伝えるのですか?

何らかの方法でキーストアを指定した後、サーバーをクライアントに認証するために使用する証明書を指定するにはどうすればよいですか?


System.setProperty設定(以下のアプローチ)の使用を回避することをお勧めします。docs.oracle.com
javase/

回答:


111
System.setProperty("javax.net.ssl.trustStore", path_to_your_jks_file);

4
誰かがこれをWindowsボックスで参照する方法を知っていますか?System.setProperty( "javax.net.ssl.trustStore"、 "C:\\ Program Files(x86)\\ Java \\ jdk1.7.0_21 \\ jre \\ lib \\ security \\ cacerts"); は私のために働いていません:(
simgineer

4
Windowsでは、指定されたパス名は円記号\の代わりにスラッシュ/を使用する必要があります。
ドロイドマン2015年

これはうまくいきましたか?私の 'jks'ファイルにCA証明書が含まれている同じコードを使用しました。しかし、それでもjavax.xml.ws.WebServiceException:org.apache.axis2.AxisFault:Transport error:403 Error:Forbidden errorが発生し、SOAPで生成されたスタブを通じてクライアントコードを呼び出します。何か案は?
james2611nov 2015年

1
パスワードシステムプロパティ(javax.net.ssl.trustStorePassword)もあります。JVM引数として渡すこともできます-Djavax.net.ssl.trustStore = clientTrustStore.key -Djavax.net.ssl.trustStorePassword = customPassword参照docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html
Kingsly

@ james2611nov:HTTPSエンドポイントを呼び出すHTTP 403エラー(またはその他のHTTP応答)が発生する場合、それはTLSセットアップを正常に通過したことを意味します:HTTP対話は、TLSチャネルがセットアップされた後にのみ行われます(それ以外の場合は保護できません)。だから-はい、この答えは明らかにあなたのために働いた。:-)
ruakh

295

SSLプロパティは、システムプロパティを介してJVMレベルで設定されます。つまり、プログラムの実行時にそれらを設定するか(java -D ....)、またはSystem.setPropertyを実行してコードで設定できます。

設定する必要がある特定のキーは次のとおりです。

javax.net.ssl.keyStore-アプリケーションプロセス独自の証明書とプライベートキーを含むJavaキーストアファイルの場所。Windowsでは、指定されたパス名はバックスラッシュの代わりにスラッシュ/を使用する必要があります。

javax.net.ssl.keyStorePassword - javax.net.ssl.keyStoreで指定されたキーストアファイルから秘密鍵にアクセスするためのパスワード。このパスワードは2回使用されます。キーストアファイルのロックを解除する(ストアパスワード)と、キーストアに格納されている秘密キーを復号化する(キーパスワード)。

javax.net.ssl.trustStore-このアプリケーションプロセス(トラストストア)が信頼するCA証明書のコレクションを含むJavaキーストアファイルの場所。Windowsでは、指定されたパス名/はバックスラッシュの代わりにスラッシュを使用する必要があります。\

このプロパティを使用してトラストストアの場所が指定されていない場合、SunJSSE実装は、次の場所でキーストアファイルを(順番に)検索して使用します。

  1. $JAVA_HOME/lib/security/jssecacerts
  2. $JAVA_HOME/lib/security/cacerts

javax.net.ssl.trustStorePassword-で 指定されたキーストアファイル(ストアパスワード)のロックを解除するためのパスワード javax.net.ssl.trustStore

javax.net.ssl.trustStoreType-(オプション)Javaキーストアファイル形式の場合、このプロパティの値はjks(またはJKS)です。デフォルト値はすでにjksであるため、通常はこのプロパティを指定しません。

javax.net.debug -SSL / TLSレイヤーのロギングをオンにするには、このプロパティをsslに設定します。


17
これが引用されているドキュメントにリンクする方が適切です。私はこれだと思います:fusesource.com/docs/broker/5.3/security/SSL-SysProps.html
Bruno

4
公式文書では、JSSEリファレンスガイドする必要があります:docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/...
aleung


11
編集にシステムの信頼ストアをすることができ、誰のために、デフォルトのパスワードは「changeitに」であるcommunity.oracle.com/thread/1540678?start=0&tstart=0
CWC

javax.net.ssl.trustStorePasswordプロパティの+1。私はしばらく探し回っていましたが、これが最初に言及されました。
jgreen

22

注意の言葉。Java 9以降で既存のJKSキーストアを開こうとしている場合は、次のプロパティも値を「JKS」として指定する必要があります。

javax.net.ssl.keyStoreType
javax.net.ssl.trustStoreType

その理由は、java.securityファイルで規定されているデフォルトのキーストアタイプが、Java 9以降のjksからpkcs12に変更されているためです。


11

まず、キーストアには2種類あります。

個人および一般

アプリケーションは、起動時に示されたものまたはシステムのデフォルトを使用します。

JREまたはJDKが実行されている場合、または個人用または「グローバル」なものをチェックする場合は、別のフォルダになります。

それらも暗号化されています

つまり、パスは次のようになります。

$JAVA_HOME/lib/security/cacerts 当局のためのすべてのCAを持ち、非常に重要な「一般的なもの」のため。


タイプは「キーストア」と「トラストストア」です。冗長な用語を考え出さないでください。
ローン侯爵

9

-D以下のプロパティを使用して、実行時にパスを指定することもできます

-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks

私のApache Sparkアプリケーションでは、--confオプションを使用して証明書とキーストアのパスを提供し、extraJavaoptions以下のようにspark-submitを使用していました

--conf 'spark.driver.extraJavaOptions= 
-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks' 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.