【问题标题】:jboss eap jax-ws client with https fails带有 https 的 jboss eap jax-ws 客户端失败
【发布时间】:2017-07-17 14:44:43
【问题描述】:

(这是在 Windows 机器上运行 jboss eap7.0)我生成了一个 jax-ws 客户端来连接到外部 Web 服务。

它正在使用带有https://smartpayform.com/api/transaction/transaction.asmx url 的https 我已导出站点证书并插入到我创建的密钥库中。我找不到有关如何直接配置 jboss 的足够详细信息(在standalone.xml 或 cli 中),所以我 找到一些 java 代码将证书添加到 jax-ws 客户端:

    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)

更新 我在 jboss 中打开了完整的 ssl 调试日志记录。我看到端点的证书已加载:

 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

这里是套接字错误的更完整跟踪:

 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)

wireshark 下面的第一三行显示了不工作的连接。您会注意到它正在使用 SSL。第二组行来自在 soapui 中运行相同的肥皂调用。您会看到它有“TLSv1”用于客户端 Hello。所以我猜这是问题所在,但不知道为什么。

【问题讨论】:

    标签: java https jboss jax-ws


    【解决方案1】:

    来自java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind (JBOSS)

    在某些安装了 IPv6 TCP 堆栈的 Windows 系统上会出现此问题。如果计算机上同时安装了 IPv4 和 IPv6,Java 虚拟机 (JVM) 可能会在操作系统级别关闭或打开套接字时出现问题。

    添加以下 JVM 选项:

    -Djava.net.preferIPv4Stack=true 
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多