【问题标题】:How do I specify which ciphers to use on my axis2 https sender?如何指定在我的axis2 https 发件人上使用哪些密码?
【发布时间】:2015-09-11 07:47:17
【问题描述】:

我们的 WSO2 ESB 连接到 SSL 服务器,该服务器最近已被修补以删除弱/不安全的 SSL 协议和密码。通过将以下参数添加到 axis2_blocking_client.xml 配置文件中的 https 发送器元素,我已经能够更改 Axis2 https 发送器使用的协议

<transportSender name="https"
                 class="org.apache.axis2.transport.http.CommonsHTTPTransportSender">
    <parameter name="PROTOCOL">HTTP/1.1</parameter>
    <parameter name="HttpsProtocols">TLSv1,TLSv1.1,TLSv1.2</parameter>
    <parameter name="Transfer-Encoding">chunked</parameter>
    <parameter name="cacheHttpClient">true</parameter>
    <parameter name="defaultMaxConnectionsPerHost">200</parameter>
</transportSender>

但是 ESB 仍然无法连接到服务器并出现 SSL 握手错误。查看服务器上的数据包捕获,我们看到 ESB 提供的密码都不在服务器接受的密码列表中。

所以我的问题是,如何在我的axis2 https 发件人配置中指定使用(或不使用)哪些密码?

附: 这是服务器正在接受的内容

 RSA_WITH_RC4_128_SHA
 RSA_WITH_3DES_EDE_CBC_SHA
 RSA_WITH_AES_128_CBC_SHA
 RSA_WITH_AES_256_CBC_SHA
 RSA_WITH_AES_128_CBC_SHA256
 RSA_WITH_AES_256_CBC_SHA256
 TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384

这就是 ESB 提供的功能

 TLS_RSA_WITH_AES_128_CBC_SHA
 TLS_DHE_RSA_WITH_AES_128_CBC_SHA
 TLS_DHE_DSS_WITH_AES_128_CBC_SHA
 TLS_RSA_WITH_RC4_128_SHA
 TLS_RSA_WITH_3DES_EDE_CBC_SHA
 TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
 TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
 TLS_RSA_WITH_RC4_128_MD5

P.P.S. 这是从服务器的角度捕获的数据包:

新的 TCP 连接 #3:XXX.XXX.XXX.XXX(40922) XXX.XXX.XXX.XXX(8006) 1 1 1435165035.7617 (0.0292) C>SV3.1(185) 握手 客户你好

    Version 3.1
    random[32]=
      55 8a e1 6b f3 30 a8 68 42 dd f0 b4 96 c6 39 9d
      15 78 3d bd b2 77 2b 76 39 82 c4 2e 98 be 71 92

    cipher suites
    Unknown value 0xc009
    Unknown value 0xc013
    TLS_RSA_WITH_AES_128_CBC_SHA
    Unknown value 0xc004
    Unknown value 0xc00e
    TLS_DHE_RSA_WITH_AES_128_CBC_SHA
    TLS_DHE_DSS_WITH_AES_128_CBC_SHA
    Unknown value 0xc007
    Unknown value 0xc011
    TLS_RSA_WITH_RC4_128_SHA
    Unknown value 0xc002
    Unknown value 0xc00c
    Unknown value 0xc008
    Unknown value 0xc012
    TLS_RSA_WITH_3DES_EDE_CBC_SHA
    Unknown value 0xc003
    Unknown value 0xc00d
    TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
    TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
    TLS_RSA_WITH_RC4_128_MD5
    Unknown value 0xff
    compression methods
              NULL

1 2 1435165035.7617 (0.0000) S>CV3.1(2) 警报 致命级别 值握手失败 1 1435165035.7618 (0.0000) S>C TCP FIN

【问题讨论】:

  • axis2_blocking_client.xml 中的 TLSv1、TLSv1.1、TLSv1.2 设置在哪里?
  • 看起来TLS_RSA_WITH_RC4_128_SHATLS_RSA_WITH_AES_128_CBC_SHATLS_RSA_WITH_3DES_EDE_CBC_SHA 无论如何都是这两个列表之间的匹配项。这是什么类型的服务器?你确定两边都启用了吗?
  • @Bruno,我假设密码套件只有在全名匹配时才等效。但是您的意思是,出于 SSL 握手协商的目的,应该将 TLS_RSA_WITH_RC4_128_SHA 和 RSA_WITH_RC4_128_SHA 视为等效密码?如果是这样的话,我需要对这个主题做更多的研究。
  • 它运行的是什么服务器?例如,您是否使用(或服务器期望)客户端证书?顺便说一句,不确定您在哪里找到了有关 HttpsProtocols 参数的任何文档。
  • 参数来自this link。我要连接的服务器严格来说不是一台服务器,而是位于几个 Websphere 服务器前面的 F5 负载均衡器。直到安全审计建议 F5 管理员禁用弱协议和密码,整个想法才得以实现

标签: ssl axis2 wso2esb


【解决方案1】:

我没有检查过 Axis 2 的最新版本,但您应该能够使用与 this question 中所述相同的原理来设置协议和密码套件。

基本上,您需要向 Apache HTTP Client 3.x 注册 SecureProtocolFactory(如果它仍在使用 Axis 2):

Protocol.registerProtocol("https", new Protocol("https",
   (ProtocolSocketFactory)secureProtocolSocketFactory, 443));

您可以将工厂的默认行为扩展或委托给existing implementation。但是,在从 createSocket 方法返回 SSLSocket 实例之前,请使用您需要的设置调用 setEnabledCipherSuites(...)setEnabledProtocols(...)

也就是说,从您的客户端发送的密码套件列表中,并且基于根本没有配置它的假设(因此它将使用默认设置),我猜您可能正在运行旧版本的 JRE(请参阅 cipher suite table in the SunJSSE provider documentation)。

我不确定 Axis2 如何通过代码偏离默认设置,但如果您能够使用 Java 8,则可能值得尝试新的 jdk.tls.client.protocols system property(尽管对于 Java 8,应该启用 TLS 1.2默认)。在这种情况下,您可能根本不需要更改任何代码。如果可能,使用 JCE Unlimited Strength Jurisdiction Policy Files 也将有助于 AES 256 密码套件。

在您进行编辑后,您的客户实际上发送的密码套件名称似乎比您想象的要多。您用来转储 ClientHello 的内容无法计算出那些未知值是什么,但它包含的密码套件比您写下的要多。 0xc0009 将是 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA(参见 full list)。在命名方面,TLS_ or SSL_ prefix is rather flexible depending on the tool you use。 OpenSSL 和 Java 名称也不完全相同。

虽然此答案应回答“如何指定在我的axis2 https 发件人上使用哪些密码?”,但这可能无法帮助您解决实际问题。

【讨论】:

  • 切换到 java 1.8 允许我完成 SSL 握手,但它破坏了应用程序的其他部分。所以正如你所说,这解决了如何连接(这是问题所在),但不是我的根本问题。因此,我将接受您的回答为有效。
猜你喜欢
  • 2011-03-22
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
相关资源
最近更新 更多