使用Axis2附加客户端证书?

时间:2011-12-26 22:20:42

标签: java ssl axis2 ssl-certificate axis

是否可以轻松地将客户端证书附加到使用wsdl2java生成的Axis2存根?我需要在每个请求的基础上动态更改客户端证书,因此只需将其存储在密钥库中就不适用于我们的情况。

我找到了为非SOAP调用执行此操作的示例,但找不到与使用Axis客户端存根相关的任何内容。试图破解XML for SOAP调用是一个选项,我猜,albiet是一个痛苦的选择!呻吟!

1 个答案:

答案 0 :(得分:6)

如果您想根据所建立的连接更改使用的证书,则需要配置SSLContext来执行此操作,如本答案中所述:https://stackoverflow.com/a/3713147/372643

据我所知,Axis 2使用Apache HttpClient 3.x,因此您需要按照配置SSLContext的方式(如果需要,还需要X509KeyManager)。 最简单的方法可能是使用https配置Apache HttpClient的全局SSLContext协议处理程序,并设置X509KeyManager,配置为根据需要选择客户端证书(通过chooseClientAlias )。

如果发卡者和连接的Socket(可能是远程地址)不足以决定选择哪个证书,您可能需要实现一个更复杂的逻辑,几乎不可避免地要求与其余部分仔细同步你的申请。

修改

构建SSLContextX509KeyManager后,需要将它们传递给Apache HttpClient 3.x.为此,您可以构建自己的SecureProtocolSocketFactory,它将从此SSLContext构建套接字(通过SSLSocketFactory,请参阅SSLContext方法)。 Apache HttpClient 3.x SSL guide中有一些例子。避免EasySSLProtocolSocketFactory,因为它不会检查任何服务器证书(从而允许MITM攻击)。您也可以尝试this implementation

请注意,您只需要自定义X509KeyManager,您可以使用SSLContext初始化init(通过null)其他参数以保留默认值(特别是默认的信任设置)。

然后,使用以下内容为Apache HttpClient 3.x全局“安装”此SecureProtocolSocketFactory

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