2016-07-18 14 views
-1

私はSOAPメッセージを介してサードパーティのサーバーに接続するクライアント側アプリケーションを構築しています。 JBoss 4.2.3で動作するjax-ws 2.1.9とjdk 1.6_18を使用しています。SSLSocketFactoryを使用した証明書検証のバイパス

問題は、テスト専用に構成されたサーバーが期限切れの証明書を返すことで、私のアプリケーションが以下の例外をスローしてしまうことです。

13:43:26,738 ERROR [STDERR] Caused by: javax.xml.ws.WebServiceException: java.io.IOException: Could not transmit message 
13:43:26,739 ERROR [STDERR]  at org.jboss.ws.core.jaxws.client.ClientImpl.handleRemoteException(ClientImpl.java:404) 
13:43:26,739 ERROR [STDERR]  at org.jboss.ws.core.jaxws.client.ClientImpl.invoke(ClientImpl.java:314) 
13:43:26,739 ERROR [STDERR]  at org.jboss.ws.core.jaxws.client.ClientProxy.invoke(ClientProxy.java:172) 
13:43:26,739 ERROR [STDERR]  at org.jboss.ws.core.jaxws.client.ClientProxy.invoke(ClientProxy.java:152) 
13:43:26,739 ERROR [STDERR]  at $Proxy724.solicitarBaixaOperation(Unknown Source) 
13:43:26,740 ERROR [STDERR]  at com.totvs.foundation.exchange.connector.ptu.implementation.v70_batch.InvoiceWriteOffConnector.process(InvoiceWriteOffConnector.java:91) 
13:43:26,740 ERROR [STDERR]  ... 98 more 
13:43:26,740 ERROR [STDERR] Caused by: java.io.IOException: Could not transmit message 
13:43:26,740 ERROR [STDERR]  at org.jboss.ws.core.client.HTTPRemotingConnection.invoke(HTTPRemotingConnection.java:255) 
13:43:26,740 ERROR [STDERR]  at org.jboss.ws.core.client.SOAPProtocolConnectionHTTP.invoke(SOAPProtocolConnectionHTTP.java:73) 
13:43:26,741 ERROR [STDERR]  at org.jboss.ws.core.CommonClient.invoke(CommonClient.java:339) 
13:43:26,741 ERROR [STDERR]  at org.jboss.ws.core.jaxws.client.ClientImpl.invoke(ClientImpl.java:302) 
13:43:26,741 ERROR [STDERR]  ... 102 more 
13:43:26,741 ERROR [STDERR] Caused by: org.jboss.remoting.CannotConnectException: Can not connect http client invoker. java.security.cert.CertificateExpiredException: NotAfter: Thu Sep 11 09:35:00 GMT-03:00 2014. 
13:43:26,741 ERROR [STDERR]  at org.jboss.remoting.transport.http.HTTPClientInvoker.useHttpURLConnection(HTTPClientInvoker.java:348) 
13:43:26,742 ERROR [STDERR]  at org.jboss.remoting.transport.http.HTTPClientInvoker.transport(HTTPClientInvoker.java:137) 
13:43:26,742 ERROR [STDERR]  at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:122) 
13:43:26,742 ERROR [STDERR]  at org.jboss.remoting.Client.invoke(Client.java:1634) 
13:43:26,742 ERROR [STDERR]  at org.jboss.remoting.Client.invoke(Client.java:548) 
13:43:26,742 ERROR [STDERR]  at org.jboss.ws.core.client.HTTPRemotingConnection.invoke(HTTPRemotingConnection.java:233) 
13:43:26,743 ERROR [STDERR]  ... 105 more 
13:43:26,743 ERROR [STDERR] Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateExpiredException: NotAfter: Thu Sep 11 09:35:00 GMT-03:00 2014 
13:43:26,743 ERROR [STDERR]  at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) 
13:43:26,743 ERROR [STDERR]  at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1611) 
13:43:26,744 ERROR [STDERR]  at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:187) 
13:43:26,744 ERROR [STDERR]  at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:181) 
13:43:26,744 ERROR [STDERR]  at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1035) 
13:43:26,744 ERROR [STDERR]  at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:124) 
13:43:26,744 ERROR [STDERR]  at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516) 
13:43:26,745 ERROR [STDERR]  at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:454) 
13:43:26,745 ERROR [STDERR]  at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884) 
13:43:26,745 ERROR [STDERR]  at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1112) 
13:43:26,745 ERROR [STDERR]  at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1139) 
13:43:26,745 ERROR [STDERR]  at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123) 
13:43:26,746 ERROR [STDERR]  at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434) 
13:43:26,746 ERROR [STDERR]  at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166) 
13:43:26,746 ERROR [STDERR]  at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:904) 
13:43:26,746 ERROR [STDERR]  at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230) 
13:43:26,746 ERROR [STDERR]  at org.jboss.remoting.transport.http.HTTPClientInvoker.useHttpURLConnection(HTTPClientInvoker.java:277) 
13:43:26,747 ERROR [STDERR]  ... 110 more 
13:43:26,747 ERROR [STDERR] Caused by: java.security.cert.CertificateExpiredException: NotAfter: Thu Sep 11 09:35:00 GMT-03:00 2014 
13:43:26,747 ERROR [STDERR]  at sun.security.x509.CertificateValidity.valid(CertificateValidity.java:256) 
13:43:26,747 ERROR [STDERR]  at sun.security.x509.X509CertImpl.checkValidity(X509CertImpl.java:570) 
13:43:26,747 ERROR [STDERR]  at sun.security.validator.SimpleValidator.engineValidate(SimpleValidator.java:134) 
13:43:26,748 ERROR [STDERR]  at sun.security.validator.Validator.validate(Validator.java:218) 
13:43:26,748 ERROR [STDERR]  at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126) 
13:43:26,748 ERROR [STDERR]  at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209) 
13:43:26,748 ERROR [STDERR]  at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249) 
13:43:26,748 ERROR [STDERR]  at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1014) 
13:43:26,749 ERROR [STDERR]  ... 122 more 

したがって、私はこれらの検証をバイパスしようとしています。私は以下のコードスニペットに私を導いたブログや記事をいくつか見つけました。私はでCertificateExpiredExceptionはまだ投げされのSSLSocketFactoryを設定していたが、

/** 
Inner class for set a blind TrustManager 
**/ 
public class BlindTrustManager implements X509TrustManager { 
    public X509Certificate[] getAcceptedIssuers() { 
     return new X509Certificate[0]; 
    } 
    public void checkClientTrusted(X509Certificate[] chain, String authType) 
      throws CertificateException { 
    } 
    public void checkServerTrusted(X509Certificate[] chain, String authType) 
      throws CertificateException { 
    } 
} 

/*Get the port instance of the web service interface created by JAX-WS*/ 
SolicitarBaixaPortType port = InvoiceWriteOffWebService.getInstance(serviceName, wsdlLocation); 

/*set the socket factory*/ 
SSLContext ctx = SSLContext.getInstance("TLSv1"); 
      ctx.init(null, new TrustManager[] { new BlindTrustManager() }, null); 
      SSLSocketFactory sslSocketFactory = ctx.getSocketFactory(); 
      ((BindingProvider) port).getRequestContext().put(BindingProviderProperties.SSL_SOCKET_FACTORY, sslSocketFactory); 
((BindingProvider) port).getRequestContext().put(com.sun.xml.internal.ws.client.BindingProviderProperties.SSL_SOCKET_FACTORY, sslSocketFactory); 

/*message is the Object Jax generated*/ 
response = port.solicitarBaixaOperation(message); 

。それで、次の質問が出されます:

  1. 私はそうしていますか?
  2. 接続が私のBlindTrustManagerクラスを確認する方法を教えてください。私はそれをログ上で見ることはできません。
  3. に渡す必要がある正しい文字列を確認するにはどうすればいいですか?SSLSocketFactoryを見つけることができるリクエストコンテキスト?
  4. JBossで行う必要がある他の設定はありますか?

おかげ

+0

'テスト目的のために'常に私の中に神の恐れを打つ。実際の質問は、証明書が期限切れになった理由です。テスト目的コードを回避するコードを書くことは、テスト目的のコードを生産に漏らすための唯一の方法であり、何年もの間、未検証で安全ではない。問題を解く*。症状だけを治療しないでください。 – EJP

+0

これは問題は解決しないが、Webサービスの所有者がテスト環境でそれを修正しないため、証明書が期限切れになったことに同意します。私が前に言ったように、それは私が干渉する方法がないサードパーティのサービスです。所有者の介入なくこの問題を適切に解決する方法はありますか? –

答えて

0

これは私がフレームワークに慣れていないんだと推測ですが、url.openConnectionを(使用してJBossがされている場合は)、私はあなたがJVM全体のデフォルトを設定する必要があるだろうと思い

javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sslSocketFactory); 

nbこれはより広い意味を持つかもしれません。もしこれが有効であれば、この証明書を特にホワイトリストに登録することもできます。

関連する問題