2017-02-21 3 views
0

私はGlassFishマシンからcurlコマンドを使用して、cert.pemファイルを指定してURLにアクセスできます。GlassfishのGETから.pemファイルを指定して

しかし、私のJavaアプリケーションでは、例外が発生したのとまったく同じ情報を保持するjksファイルを使用しようとしました。

私はJavaでこれをやっている:

System.setProperty("javax.net.ssl.keyStore", keystore_path); 
    System.setProperty("javax.net.ssl.keyStorePassword", "pass123"); 

キーストアのパスが

getClass().getClassLoader().getResource("/keystore.jks").getPath() 

によって取得された私は、keytoolユーティリティとうまくJKSファイル内部を見ることができますが、私は次のように取得していますグラスフィッシュのスタックトレース:

sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java: 141) at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java: 126) at java.security.cert.CertPathBuilder.build(CertPathBuilder.java: 280) at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java: 382) at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java: 292) at sun.security.validator.Validator.validate(Validator.java: 260) at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java: 324) at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java: 229) at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java: 124) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java: 1491) at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java: 216) at sun.security.ssl.Handshaker.processLoop(Handshaker.java: 979) at sun.security.ssl.Handshaker.process_record(Handshaker.java: 914) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java: 1062) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java: 1375) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java: 1403) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java: 1387) at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java: 543) at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java: 409) at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java: 177) 

提案の1つは、one-wa yのハンドシェイクがありますが、その指定方法がわかりません。

また、作業用のcurlコマンドの場合と同じように.pemファイルを指定できますが、これには何らかの利得がありますか?

答えて

1

キーストアには、絶対的な場所にもそのkeystore_pathポイントを確認してください

System.setProperty("javax.net.ssl.trustStore", keystore_path); 
System.setProperty("javax.net.ssl.trustStorePassword", "pass123"); 

、trustStoreに変数を設定する必要はありません。クラスパスからファイルをロードできません

+0

キーストアの代わりにtrustStoreをロードすると、org.apache.hadoop.gateway.shell.HadoopExceptionが発生します:トラストストアをロードできません。パスワード設定またはトラストストア形式に関連する可能性があります。 keytool -list -v -keystore store.jks(正しいパスワードがあることを意味します)を使用して、certの内容にアクセスできます。 – Eugen

+0

[Hadoop](https://github.com/apache/knox/blob/master/gateway-shell/src/main/java/org/apache/hadoop/gateway/shell/Hadoop.java)は 'javaxを使用しています.net.ssl.trustStoreも。根本原因はIOException(コード参照)です。ファイルアクセス権があるか、不良ファイルを指している可能性がありますか? (あなたはパスワードが正しいと言った)。 – pedrofb

+0

合格は間違いなく、私はkeytool -list -v -keystore store.jksを使ってjksの内容を調べることができます。 Yepp、Hadoopもトラストストアを使用しています。キーストアのプロパティを設定すると私にはこれが与えられますが、トラストストアを設定すると有効な証明書のパスが見つからなくなります。 JKSファイルは配備された戦争に含まれており、jksファイルを使用してHiveのjdbc接続を認証していますので、正常に動作します。これについて完全に困惑しました... – Eugen

関連する問題