如何指定在我的axis2 https发件人上使用哪些密码?

时间:2015-06-24 22:00:43

标签: ssl axis2 wso2esb

我们的WSO2 ESB连接到SSL服务器,最近已修补该服务器以删除弱/不安全的SSL协议和密码。我已经能够通过将以下参数添加到axis2_blocking_client.xml配置文件中的https sender元素来更改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发送器配置中指定要使用哪些密码(或哪些密码不使用?)

P.S。 这是服务器接受的内容

 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)&lt; - &gt; XXX.XXX.XXX.XXX(8006) 1 1435165035.7617(0.0292)C> SV3.1(185)握手       的ClientHello

    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&gt; CV3.1(2)警报     水平致命     值handshake_failure 1 1435165035.7618(0.0000)S> C TCP FIN

1 个答案:

答案 0 :(得分:2)

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

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

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

您可以将工厂的默认行为扩展或委派给existing implementation。但是,在从SSLSocket方法返回createSocket个实例之前,请使用您需要的设置调用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名称也不完全相同。

虽然这个答案应该回答&#34; 如何指定我的axis2 https发件人使用哪些密码?&#34;,这可能无法帮助您解决实际问题。