2017-09-13 108 views
0

我已在weblogic 10.3.6中使用JAX-WS實現了不同類型Web服務的連接器,可以使用2waySSL和代理將連接器與它們結合。在WebLogic 10.3.6中結合使用2waySSL和代理使用JAX-WS

  • 使用代理的實現可以使用ClientProxyFeature正常工作。
  • 與使用Oracle自定義SSLSocketFactory的2waySSL一樣,Oracle在文檔中說過。 Persisting the State of a Request over SSL (JAX-WS Only)

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

問題時,結合這兩種功能發生。握手不happend(客戶問候)

的錯誤是:

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) 

調試運行和反編譯的WebLogic源我可以看到HttpsClient當使用代理服務器不使用自定義SSLSocketFactory的。

1)在運輸類weblogic.wsee.jaxws.transport.http.client.HttpClientTransport weblogic的打開連接:

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)); 
     } 
… 

正如你所看到的,設置自定義的SSLSocketFactory。

2)如果沒有代理,該weblogic.net.http.HttpsClient使用自定義的SSLSocketFactory創建插座

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

的localSocketFactory是自定義的SSLSocketFactory。

3)但是,如果使用代理,然後創建一個新的SSLSocketFactory

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(); 

的sslInfo是沒有在SSLSocketFactory的通知密鑰庫或信任的對象。我還沒有看到任何方式通知對象sslInfo(weblogic.security.SSL.SSLClientInfo)

的變量啓動WebLogic是下一個:

-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 

定製SSLSocketFactory的是與此PARAMS創建並使用默認的trustore。當沒有使用代理服務器時,所有東西都起作用

我不明白爲什麼要使代理連接與weblogic不使用相同的SSLSocketFactory。

任何想法?

回答

0

Oracle人員已經確認我們在這個實現中是一個「bug」,它只能通過屬性-duseSunHttpHandler = true來解決。

在Oracle 12中,您可以使用ClientProxyFeature的setter方法setUseSunHttpHandler。但用weblogic實現是不可能解決的。

相關問題