是否可以轻松地将客户端证书附加到使用wsdl2java生成的Axis2存根?我需要在每个请求的基础上动态更改客户端证书,因此只需将其存储在密钥库中就不适用于我们的情况。
我找到了为非SOAP调用执行此操作的示例,但找不到与使用Axis客户端存根相关的任何内容。试图破解XML for SOAP调用是一个选项,我猜,albiet是一个痛苦的选择!呻吟!
答案 0 :(得分:6)
如果您想根据所建立的连接更改使用的证书,则需要配置SSLContext
来执行此操作,如本答案中所述:https://stackoverflow.com/a/3713147/372643
据我所知,Axis 2使用Apache HttpClient 3.x,因此您需要按照配置SSLContext
的方式(如果需要,还需要X509KeyManager
)。
最简单的方法可能是使用https
配置Apache HttpClient的全局SSLContext
协议处理程序,并设置X509KeyManager
,配置为根据需要选择客户端证书(通过chooseClientAlias
)。
如果发卡者和连接的Socket
(可能是远程地址)不足以决定选择哪个证书,您可能需要实现一个更复杂的逻辑,几乎不可避免地要求与其余部分仔细同步你的申请。
修改强>:
构建SSLContext
和X509KeyManager
后,需要将它们传递给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));