使用Axis2附加客户端证书?

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

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

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

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

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

编辑

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

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

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

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