2016-03-28 14 views
0

2つのアプリケーションがglassfishでホストされています(2)バッチサーバー(スタンドアロンJavaアプリケーション)です。 どちらのアプリも、共通のJavaプログラム(jarファイル形式)を使用して外部サーバーを呼び出しています。私は 'CloseableHttpClient'を使用して、その外部サードパーティサーバに接続しています。 sun.security.validator:私のサーバー1(のglassfish)Iが呼び出すとバッチサーバ上の外部サーバが、同じプログラムからの応答を取得することができていますから は、SSLのexceptoion証明書がcacertファイルにありますが、ssl例外がスローされます

javax.net.ssl.SSLHandshakeException下に投げています.ValidatorException:PKIXパスの構築に失敗しました:sun.security.provider.certpath.SunCertPathBuilderException:要求されたターゲットへの有効な証明書パスを見つけることができません。 com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) ) com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1747) com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:241) com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(H andshaker.java:235) (com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1209) (com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker。 java:135) com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593) (com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java: 529) com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:943) com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1188) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1215) com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1199) のorg.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:290) at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:259) at org.apache。 http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:125)org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:319)org.apache.http.impl.execchainで で 。 (MainClientExec.java:219) at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec。 java:195) at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:86) at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108) at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) at org.apache。 http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) (org.apache.http.impl.client.CloseableHttpClient.java:106) (com.csid.sms.util.postup)。 PostUpRestClient.executeRequest(PostUpRestClient.java:169)com.csid.sms.util.postup.PostUpRestClient.executeJsonRequestでcom.csid.sms.util.postup.PostUpRestClient.executeJsonPost(PostUpRestClient.java:134) で (PostUpRestClient。 java:106) at com.csid.sms.util.postup.PostUpEmailRoute.triggerMessage(PostUpEmailRoute.java:213) at itm.mo itm.monitor.SummaryEmailRoute.sendEmail(SummaryEmailRoute.java:49) でcom.csid.sms.messaging.MessagingHandler.triggerMessage(MessagingHandler.java:60) でnitor.SummaryEmailPostupRoute.triggerMessage(SummaryEmailPostupRoute.java:154) でitm.monitor.BatchEmailProcessor.sendEmail(BatchEmailProcessor.java:105) at itm.monitor.BatchEmailProcessor.call(BatchEmailProcessor。java:51) itm.monitor.BatchEmailProcessor.call(BatchEmailProcessor.java:33) at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask。実行(FutureTask.java:138) at java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:439) at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:895) at java.util.concurrent.ThreadPoolExecutor $ Worker.run( ThreadPoolExecutor.java:918) (java.lang.Thread.run)(Thread.java:662) 原因:sun.security.validator.ValidatorExce ption:PKIXパスの構築に失敗しました:sun.security.provider.certpath.SunCertPathBuilderException:要求されたターゲットへの有効な証明書パスを見つけることができませんat sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:323) at sun.security。 validator.PKIXValidator.engineValidate(PKIXValidator.java:217)at sun.security.validator.Validator.validate(Validator.java:218) com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl。 (X509TrustManagerImpl.java:208) 249) com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1188) ... 37もっと によって引き起こさ:sun.security.provider.certpath.SunCertPathBuilderException:sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)で要求されたターゲット への有効な証明書パスを見つけることができません java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:318) で ... 43時より

注 - この管理サーバー(glassfishでホストされている)からではなく、バッチ・サーバーからのみ例外がスローされています。

このエラーを検出した後、外部サーバーから取得した証明書が信頼できる機関によって発行されない可能性があるため、「installCert」(this java program)を使用して証明書をインポートしました。今

は、keytoolのコマンドに

のkeytool -list -keystore cacertsを

を使用してcacertで証明書を検証し、私は外部の証明書が信頼できる証明書のリストに表示されていることがわかります。 ですが、まだSSL例外を超えています。

考えてみませんか? 同じJavaコードを使用している管理サーバー(glassfish)からSSLの期待値が得られないのはなぜですか?グラスフィッシュはブラウザのように自動的に証明書をインポートしますか?

答えて

0

異なるJREを使用しているため、バッチプログラムと管理アプリケーションの動作が異なる可能性があります。すべてのJREには独自のcacertsがあります。

+0

それは本当に両方の異なるJREを使用していると私はバッチサーバーのJREをチェックし、証明書があります。 – vermap

0

JREが実際に証明書をインポートしたトラストストアを使用しているかどうかを確認する必要があります。
JVMランタイム引数 "-Djavax.net.debug = all"を追加し、サーバーを再起動します。これにより、サーバーの起動時にJVMによってロードされたトラストストアが印刷されます。

関連する問題