当前位置: 首页 > 知识库问答 >
问题:

在Weblogic 10.3.6中使用JAX-WS结合2waySSL和Proxy

邢俊悟
2023-03-14

我在weblogic 10.3.6中用JAX-WS实现了一个到不同类型Web服务的连接器,该连接器可以配置为2waySSL和代理,并将两者结合起来。

>

  • 使用代理的实现使用ClientProxyFeature正常工作。
  • 与使用自定义SSLSocketFactory的2waySSL相同,Oracle在留档中说。通过SSL保持请求的状态(仅限JAX-WS)

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

    当组合这两个功能时会出现问题。握手没有发生(ClientHello)

    错误是:

        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.HttpClientCommunications 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是使用此参数和默认信任库创建的。当没有使用代理时,一切都正常工作。

    我不明白为什么与代理建立连接weblogic不使用相同的SSLSocketFactory。

    有什么想法吗?

  • 共有1个答案

    潘高岑
    2023-03-14

    甲骨文的人已经确认我们,在这个实现中是一个“错误”,只有用属性-DUseSunHttpHandler=true才能解决。

    在Oracle 12中,可以使用ClientProxyFeature的setter方法setUseSunHttpHandler。但用weblogic实现是不可能解决的。

     类似资料:
    • 问题内容: 我构建了一个最小的Web服务,并使用javax.xml.ws.Endpoint发布了它。如果我尝试获得WSDL, 它就可以正常工作。 尝试在接收它,我什么也没收到。该地址与本地主机相同。 是否可以在不提供地址的情况下发布网络服务? 将代码更改为 在IP地址上获取wsdl,但不在本地主机上获取。 是否没有可能仅定义端口? 问题答案: 您可以尝试在0.0.0.0上发布它吗?

    • 我的怀疑是 > 为什么要调用webservice,而不是使用? 可以用来调用此webservice吗

    • 问题内容: 如何编写JAX-WS服务,以便我的@WebMethod的@WebParam是类似于DateTime的Joda- Time类?参数上的@XmlTypeAdapter是否可以工作?我正在部署到GlassFish 2.1。 让我澄清这个问题,因为到目前为止,这两个答案都集中在将自定义类型绑定到现有的JAXB类上,这与之相关,但与我要问的问题无关。如何使以下@WebService接受joda

    • JAX-WS (JavaTM API for XML-Based Web Services)规范是一组XML web services的JAVA API。JAX-WS允许开发者可以选择RPC-oriented或者message-oriented 来实现自己的web services。 在 JAX-WS中,一个远程调用可以转换为一个基于XML的协议例如SOAP。在使用JAX-WS过程中,开发者不需要

    • 问题内容: 我有一个已导入xsd的wsdl,此xsd具有类似如下的限制: 因此,我想细想一下,当我通过netbeans将这个耳朵部署到glassfish上时,将对传入的数据进行验证,但事实并非如此。在将数据传递给我的@WebService对象并转换为Java对象之前,是否需要进行任何调用以确保数据经过验证。 问题答案: 使用SchemaValidation批注。 请注意,它仅适用于文档/文字样式的

    • Apache CXF WebService 没有话说,享受沉默 showcase项目已演示了JAX-WS2.0 + CXF 的最重要特性, 其中客户端在测试用例里. SOAP这个名字,本身就是个笑话,一点都不Simple。其他一些WS-*协议,包括安全,附件等都不再看好,因此SpringSide4.0没什么更新。 测试工具依然是SoapUI。 Tips 1. CXF自动生成的WSDL与WADL文件