2017-09-13 9 views
0

Ich habe in weblogic 10.3.6 einen Connector für verschiedene Arten von Webservice mit JAX-WS implementiert, der Connector kann mit 2waySSL, Proxy konfiguriert und kombiniert werden .Verwendung von JAX-WS in Weblogic 10.3.6 Kombination von 2waySSL und Proxy

  • Die Implementierung zur Verwendung von Proxy funktioniert ordnungsgemäß mit ClientProxyFeature.
  • In der gleichen Weise mit 2waySSL mit einer benutzerdefinierten SSLSocketFactory wie Oracle in der Dokumentation sagt. Persisting the State of a Request over SSL (JAX-WS Only)

    ((BindingProvider) port).getRequestContext().put(
        JAXWSProperties.SSL_SOCKET_FACTORY, 
        SSLClientUtil.getSSLSocketFactoryFromSysProperties()); 
    

Das Problem tritt auf, wenn beide Funktionen kombinieren. Der Handshake passiert nicht (Client)

Der Fehler ist:

ACTIVE] ExecuteThread: '19' for queue: 'weblogic.kernel.Default (self-tuning)', READ: TLSv1.2 Alert, length = 64 
Padded plaintext after DECRYPTION: len = 64 
0000: F0 E5 6E 9F 6F F4 BB 2E 07 29 56 FE 34 0A 10 0B ..n.o....)V.4... 
0010: 02 28 7E 75 92 F7 03 4E CD 3A 7E 0B E2 6A 7C 8E .(.u...N.:...j.. 
0020: 3B F8 4E F5 98 A3 D3 B4 67 76 20 49 1B 77 07 5E ;.N.....gv I.w.^ 
0030: 9D 66 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D .f.............. 
[ACTIVE] ExecuteThread: '19' for queue: 'weblogic.kernel.Default (self-tuning)', RECV TLSv1.2 ALERT: fatal, handshake_failure 
[ACTIVE] ExecuteThread: '19' for queue: 'weblogic.kernel.Default (self-tuning)', fatal: engine already closed. Rethrowing javax.net.ssl.SSLException: Received fatal alert: handshake_failure 
[ACTIVE] ExecuteThread: '19' for queue: 'weblogic.kernel.Default (self-tuning)', fatal: engine already closed. Rethrowing javax.net.ssl.SSLException: Received fatal alert: handshake_failure 
<13-sep-2017 09H32' CEST> <Debug> <SecuritySSL> <BEA-000000> <[Thread[[ACTIVE] ExecuteThread: '19' for queue: 'weblogic.kernel.Default (self-tuning)',5,Pooled Threads]]weblogic.security.SSL.jsseadapter: SSLENGINE: Exception occurred during SSLEngine.unwrap(ByteBuffer,ByteBuffer[]). 
javax.net.ssl.SSLException: Received fatal alert: handshake_failure 
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:188) 
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1614) 
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1582) 
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.recvAlert(SSLEngineImpl.java:1751) 
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:1043) 
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:865) 
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:740) 

debuging und decompiling weblogic Quelle ich, dass die HttpsClient sehen kann, wenn Verwendung Proxy nicht den benutzerdefinierten SSLSocketFactory verwenden.

1) In der Transportklasse weblogic.wsee.jaxws.transport.http.client.HttpClientTransport weblogic öffnet die Verbindung:

protected HttpURLConnection openConnection(Packet paramPacket) 
           … 

localSSLSocketFactory = (javax.net.ssl.SSLSocketFactory)this.context.invocationProperties.get("com.sun.xml.ws.transport.https.client.SSLSocketFactory"); 
     if ((localSSLSocketFactory != null) && ((localSSLSocketFactory instanceof javax.net.ssl.SSLSocketFactory))) 
     { 
      if (LOGGER.isLoggable(Level.FINE)) { 
      LOGGER.fine("set (jdk) ssl socketfactory to wls socketfactory"); 
      } 
      ((weblogic.net.http.HttpsURLConnection)localObject3).setSSLSocketFactory(new MySSLSocketFactory((javax.net.ssl.SSLSocketFactory)localSSLSocketFactory)); 
     } 
… 

Wie Sie sehen können, stellen Sie das benutzerdefinierte SSLSocketFactory.

2) ohne Proxy-Server verwendet die weblogic.net.http.HttpsClient die benutzerdefinierte SSLSocketFactory den Sockel

this.serverSocket = localSocketFactory.createSocket(arrayOfInetAddress[i], paramInt); 

Die localSocketFactory ist der Brauch SSLSocketFactory zu erstellen.

3) Aber wenn Verwendungen Proxy dann eine neue SSLSocketFactory erstellen

private void makeConnectionUsingProxy(String s, int i, boolean flag) 
    throws IOException 
{ 
    javax.net.ssl.SSLSocketFactory sslsocketfactory; 
    int j; 
    SSLContextWrapper sslcontextwrapper = SSLSetup.getSSLContext(sslInfo); 
    sslcontextwrapper.getHostnameVerifier().setProxyMapping(s, host); 
    sslcontextwrapper.getTrustManager().setProxyMapping(s, host); 
    sslsocketfactory = sslcontextwrapper.getSSLSocketFactory(); 

Die sslInfo ist ein Objekt ohne den Schlüsselspeicher oder Trusts im SSLSocketFactory informiert. Ich habe jede mögliche Weise das Objekt nicht sslInfo (weblogic.security.SSL.SSLClientInfo)

Die Variablen zu informieren sehen Sie die WebLogic zu starten sind die nächste:

-Dweblogic.security.SSL.nojce=true -Djavax.net.debug=all -Dssl.debug=true 
-Djavax.net.ssl.keyStore=XXXXXs -Djavax.net.ssl.keyStorePassword=XXXXX 
-Djdk.tls.enableRC4CipherSuites=true -Djsse.enableSNIExtension=false -Dweblogic.ssl.JSSEEnabled=true -Dweblogic.security.SSL.enableJSSE=true -Dweblogic.security.SSL.nojce=true -Dweblogic.security.SSL.ignoreHostnameVerification=true 

Die benutzerdefinierte SSLSocketFactory ist erstellen mit diesem params und mit dem Standard-Trustore. Wenn kein Proxy verwendet wird, funktioniert alles ordnungsgemäß.

Ich verstehe nicht, warum die Verbindung mit einem Proxy Weblogic nicht die gleiche SSLSocketFactory verwenden.

Irgendwelche Ideen?

Antwort

0

Oracle Leute haben uns bestätigt, dass ein "Bug" in dieser Implementierung ist, ist es nur möglich, mit der Eigenschaft -DUseSunHttpHandler = True zu lösen.

In Oracle 12 können Sie die Setter-Methode setUseSunHttpHandler von ClientProxyFeature verwenden. Aber mit der Weblogic-Implementierung ist es nicht möglich zu lösen.

Verwandte Themen