(これはWindowsマシンでjboss eap7.0を実行しています)I外部Webサービスに接続するためのjax-wsクライアントを生成しました。httpsでjboss eap jax-wsクライアントが失敗する
URLがhttps://smartpayform.com/api/transaction/transaction.asmx
のhttpsを使用しています サイト証明書をエクスポートして作成したキーストアに挿入しました。私は(standalone.xmlまたはCLIで)直接にJBossを設定する方法の十分な詳細を見つけることができなかったので、私は はJAX-WSクライアントに証明書を追加するには、いくつかのJavaコードを見つけました:
SSLContext sc = SSLContext.getInstance("TLS");
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(new FileInputStream("C:\\Users\\amikaml\\.keystore"), certPassword.toCharArray());
kmf.init(ks, certPassword.toCharArray());
sc.init(kmf.getKeyManagers(), null, null);
binding.getRequestContext().put("com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory",sc.getSocketFactory());
コードをせずに実行されることを任意の例外。 SOAPコールを実行すると、以下のエラーが発生します。普通のスタンドアロンのJavaアプリケーションでEAP以外のWebサービスにアクセスしようとすると、正常に動作します。私は間違って何をしていますか?
Caused by: java.net.SocketException: Unrecognized Windows Sockets error: 0: recv failed
at java.net.SocketInputStream.socketRead0(Native Method) ~[?:1.8.0_111]
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) ~[?:1.8.0_111]
at java.net.SocketInputStream.read(SocketInputStream.java:170) ~[?:1.8.0_111]
at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[?:1.8.0_111]
at sun.security.ssl.InputRecord.readFully(InputRecord.java:465) ~[?:?]
at sun.security.ssl.InputRecord.read(InputRecord.java:503) ~[?:?]
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973) ~[?:?]
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 sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559) ~[?:?]
Caused by: java.net.SocketException: Unrecognized Windows Sockets error: 0: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
at sun.security.ssl.InputRecord.read(InputRecord.java:503)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973)
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 sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1316)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1291)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250)
at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.setupWrappedStream(URLConnectionHTTPConduit.java:236)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1319)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1279)
at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.onFirstWrite(URLConnectionHTTPConduit.java:267)
at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:47)
at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1332)
UPDATE 私は、JBossで完全なSSLデバッグログオン。私は、エンドポイントの証明書がロードされていることを参照してください。第一3行から以下
handling exception: java.net.SocketException: Unrecognized Windows Sockets error: 0: recv failed
SEND TLSv1.2 ALERT: fatal, description = unexpected_message
WRITE: TLSv1.2 Alert, length = 2
Exception sending alert: java.net.SocketException: Connection reset by peer: socket write error
called closeSocket()
called close()
called closeInternal(true)
:
Subject: CN=*.smartpayform.com, OU=Domain Control Validated
Issuer: CN=AlphaSSL CA - SHA256 - G2, O=GlobalSign nv-sa, C=BE
Algorithm: RSA; Serial number: 0xc2d0a153e5915039e88cbf7
Valid from Mon Sep 05 12:33:58 EDT 2016 until Wed Sep 06 12:33:58 EDT 2017
、ここでは、ソケットエラーのより完全なトレースでありますwiresharkは、動作しない接続を示します。 SSLを使用していることがわかります。 2番目の行はsoapuiで同じsoap呼び出しを実行したものです。これは、クライアントHelloの「TLSv1」を持っていることがわかります。だから私はそれが問題だと推測していますが、その理由はわかりません。
いいえ。問題は変えなかった。 – OldProgrammer
ここを参照 - https://stackoverflow.com/questions/45313201/tls1-2-support-in-jboss問題はjdkバグでした。 – OldProgrammer