我们的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
答案 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;,这可能无法帮助您解决实际问题。