2017-07-17 2 views
2

(exécute jboss eap7.0 sur une machine Windows) I Génère un client jax-ws pour se connecter au service Web externe.jboss eap jax-ws client avec https échoue

Il utilise https avec une adresse URL de https://smartpayform.com/api/transaction/transaction.asmx J'ai exporté le certificat de site et l'ai inséré dans un fichier de clés que j'ai créé. Je ne pouvais pas trouver suffisamment de détails sur la façon de configurer jboss directement (en standalone.xml ou cli), donc je trouvé un code java pour ajouter le certificat au client 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()); 

Ce code fonctionne sans toutes les exceptions. Lorsque j'exécute l'appel SOAP, j'obtiens l'erreur ci-dessous. Si j'essaie d'accéder au service Web en dehors de EAP avec une application java autonome et autonome, cela fonctionne très bien. Qu'est-ce que je fais mal?

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) 

MISE À JOUR J'activé complète l'enregistrement de débogage ssl dans jboss. Je vois que le certificat pour le point final est chargé:

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 

et voici une trace plus complète de l'erreur de socket:

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) 

UPDATE #2

Les trois 1ères lignes ci-dessous de wireshark, montre la connexion qui ne fonctionne pas. Vous remarquerez qu'il utilise SSL. Le deuxième jeu de lignes consiste à exécuter le même appel de savon dans soapui. Vous verrez qu'il a "TLSv1" pour le client Hello. Donc je devine que c'est le problème, mais je ne sais pas pourquoi.

Répondre

1

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

This problem occurs on some Windows systems that have the IPv6 TCP Stack installed. If both IPv4 and IPv6 are installed on the computer, the Java Virtual Machine (JVM) may have problems closing or opening sockets at the operating system level.

Add the following JVM option:

-Djava.net.preferIPv4Stack=true 
+0

Non. N'a pas changé le problème. – OldProgrammer

+0

Voir ici - https://stackoverflow.com/questions/45313201/tls1-2-support-in-jboss problème était un bug jdk. – OldProgrammer