【问题标题】:Weblogic breaks CXF certificate authentication when using proxy使用代理时 Weblogic 会破坏 CXF 证书身份验证
【发布时间】:2013-11-14 04:06:35
【问题描述】:

我在代码中配置了一个 CXF 客户端。它对 WS 服务器和代理设置使用证书身份验证(无需身份验证)。在单元测试和 Tomcat 上一切正常,但在 Weblogic 上部署时会中断。它通过代理,但不使用证书进行身份验证。奇怪的是,如果我不通过代理,证书身份验证工作。可能是什么问题?

我用于初始化客户端的代码:

 JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setEndpointName(SERVICE_NAME);
factory.setAddress("Address of the WS server");
factory.setServiceClass(MyService.class);
this.port = (MyService) factory.create();

Client client = ClientProxy.getClient(port);
HTTPConduit conduit = (HTTPConduit) client.getConduit();

//proxy settings
HTTPClientPolicy policy = new HTTPClientPolicy();
policy.setProxyServer("IP OF THE PROXY");
policy.setProxyServerPort("PORT OF THE PROXY");
conduit.setClient(policy);        

//TLS
KeyStore keyStore = KeyStore.getInstance(ARCHIVE_FILE_FORMAT);
keyFile = getKeyFileUrl().openStream();
keyStore.load(keyFile, getPassword().toCharArray());
KeyManager[] myKeyManagers = getKeyManagers(keyStore, getPassword());
TLSClientParameters tlsCP = new TLSClientParameters();
tlsCP.setKeyManagers(myKeyManagers);
tlsCP.setDisableCNCheck(true);
FiltersType cipherSuiteFilter = new FiltersType();
cipherSuiteFilter.getInclude().add(SSL_RSA_WITH_3_DES_EDE_CBC_SHA);
cipherSuiteFilter.getExclude().add(DH_ANON);
tlsCP.setCipherSuitesFilter(cipherSuiteFilter);
conduit.setTlsClientParameters(tlsCP);    

启用 SSL 调试后,我在日志文件中收到以下消息:

####<Oct 2, 2013 4:08:53 PM UTC> <Debug> <SecuritySSL> <lmdesetup-jab> <fwf-acg> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1380730133523> <BEA-000000> <weblogic user specified trustmanager validation status 0> 
####<Oct 2, 2013 4:08:53 PM UTC> <Debug> <SecuritySSL> <lmdesetup-jab> <fwf-acg> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1380730133523> <BEA-000000> <SSLTrustValidator returns: 0> 
####<Oct 2, 2013 4:08:53 PM UTC> <Debug> <SecuritySSL> <lmdesetup-jab> <fwf-acg> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1380730133523> <BEA-000000> <[Thread[[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)',5,Pooled Threads]]weblogic.security.SSL.jsseadapter: SSLENGINE: No trust failure, validateErr=0.> 
####<Oct 2, 2013 4:08:53 PM UTC> <Debug> <SecuritySSL> <lmdesetup-jab> <fwf-acg> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1380730133524> <BEA-000000> <Performing hostname validation checks: www.cfmu.eurocontrol.int> 
####<Oct 2, 2013 4:08:53 PM UTC> <Debug> <SecuritySSL> <lmdesetup-jab> <fwf-acg> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1380730133524> <BEA-000000> <Proxying through 85.125.226.9> 
####<Oct 2, 2013 4:08:53 PM UTC> <Debug> <SecuritySSL> <lmdesetup-jab> <fwf-acg> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1380730133525> <BEA-000000> <[Thread[[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)',5,Pooled Threads]]weblogic.security.SSL.jsseadapter: SSLENGINE: Successfully completed post-handshake processing.> 
####<Oct 2, 2013 4:08:53 PM UTC> <Debug> <SecuritySSL> <lmdesetup-jab> <fwf-acg> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1380730133526> <BEA-000000> <[Thread[[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)',5,Pooled Threads]]weblogic.security.SSL.jsseadapter: SSLENGINE: SSLEngine.wrap(ByteBuffer,ByteBuffer) called: result=Status = OK HandshakeStatus = NOT_HANDSHAKING
bytesConsumed = 230 bytesProduced = 261.> 
####<Oct 2, 2013 4:08:53 PM UTC> <Debug> <SecuritySSL> <lmdesetup-jab> <fwf-acg> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1380730133528> <BEA-000000> <[Thread[[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)',5,Pooled Threads]]weblogic.security.SSL.jsseadapter: SSLENGINE: SSLEngine.wrap(ByteBuffer,ByteBuffer) called: result=Status = OK HandshakeStatus = NOT_HANDSHAKING
bytesConsumed = 1729 bytesProduced = 1786.> 
####<Oct 2, 2013 4:08:53 PM UTC> <Debug> <SecuritySSL> <lmdesetup-jab> <fwf-acg> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1380730133627> <BEA-000000> <[Thread[[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)',5,Pooled Threads]]weblogic.security.SSL.jsseadapter: SSLENGINE: SSLEngine.unwrap(ByteBuffer,ByteBuffer[]) called: result=Status = OK HandshakeStatus = NOT_HANDSHAKING
bytesConsumed = 733 bytesProduced = 705.> 

status=OK 是什么意思?我有 ssl 连接吗?那么为什么服务器发送响应就好像不使用证书一样。

我尝试过不同版本的CXF(包括最新的2.7.7)和不同版本的weblogic。

【问题讨论】:

  • 您使用的是 DemoTrust 证书吗?看起来它基于该消息。您也可以尝试将 -Dweblogic.security.SSL.verbose=true 和 -Dssl.debug=true 添加到您的服务器启动脚本以获取更多信息。
  • 是的。但我认为问题不在于证书。如果我不使用代理,它可以工作。
  • 我已经添加了 SSL 调试输出。 (不是全部,因为有很多。只有请求后的部分)

标签: java web-services ssl weblogic cxf


【解决方案1】:

当我阅读 Oracle 文档时,Weblogic Server 似乎拒绝证书链中没有定义为 CA 的基本约束扩展的任何证书。您可以使用命令行参数:

-Dweblogic.security.SSL.enforceConstraints=option

其中选项可以是“强”或“真”、严格或关闭。查看文档:

http://docs.oracle.com/cd/E11035_01/wls100/secmanage/ssl.html#wp1194346

你设置了这个标志吗?

What worked:

启动您的 weblogic 服务器。转到“环境”下的“服务器”。单击服务器名称。在“常规”选项卡下,将 ClientCertProxyEnabled 标志设置为 true。

【讨论】:

  • 谢谢,我尝试了所有可能的设置,但没有任何效果。我也试过-Dweblogic.security.SSL.nojce=true,但这也无济于事。我被这个愚蠢的问题困了两个星期。我只是不明白为什么它可以在 Tomcat 而不是 Weblogic 上运行。如何判断证书是否具有“CA 中定义的约束扩展”?我开启了 SSL 调试,可以看到很多输出,但我不知道要查找什么。
  • 在这个论坛,forums.oracle.com/thread/2265305,日志消息,看起来和你的一样。我不是安全专家,但他们有一些重新协商的配置,这显然没有记录在 Oracle 手册中。也许你可以试试。这只是一个想法。祝你好运。
  • 也检查一下:http://:port/consolehelp/console-help.portal?_nfpb=true&_pageLabel=page&helpId=Corecoreserverserverconfiggeneraltitle#core.server.serverconfiggeneral.clientcertproxyenabled.label。也许您已经这样做了,但您必须将 ClientCetProxyEnabled 标志设置为 true。希望对您有所帮助。
  • user1807337:酷男。您的链接无效,但“clientcertproxyenabled”是正确的关键字。您能否编辑您的答案,以便我可以给您赏金。
  • 太棒了!我很高兴它奏效了。好吧,我应该提到您应该将 替换为您的 weblogic 服务器的 IP 地址,并将端口替换为实际的端口号。这就是链接不起作用的原因。当然,必须启动 weblogic 服务器!我将添加一个新答案,以便您将其标记为正确。
【解决方案2】:

我前段时间遇到过同样的问题(CXF,相互 SSL 身份验证,代理服务器,weblogic),我修补了 CXF 客户端以应用(临时)解决方法(http://pastebin.com/VfKA7MRC),因为这是一个错误从 10.3 开始的 weblogic 代码中,使用代理时的方法 weblogic.net.https.HttpsClient.openServer() 中。也许问题已经解决了,现在我已经 1.5 年没有调查了

【讨论】:

    猜你喜欢
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多