是否可以轻松地将客户端证书附加到使用 wsdl2java 生成的 Axis2 stub ?我需要根据每个请求动态更改客户端证书,因此仅将其存储在 keystore 中对我们的情况不起作用。
我找到了针对非 SOAP 调用执行此操作的示例,但找不到与使用 Axis 客户端 stub 相关的任何内容。我想尝试破解 SOAP 调用的 XML 是一种选择,尽管很痛苦!呻吟!
最佳答案
如果您想根据建立的连接更改使用的证书,您需要配置 SSLContext
这样做,如本答案中所述:https://stackoverflow.com/a/3713147/372643
据我所知,Axis 2 使用 Apache HttpClient 3.x,因此您需要按照它的方式配置 SSLContext
(和 X509KeyManager
如果需要的话)。
最简单的方法可能是配置 Apache HttpClient 的全局 https
协议(protocol)处理程序与你的 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
其他参数保持默认值(特别是默认信任设置)。
然后,“安装”这个SecureProtocolSocketFactory
全局为 Apache HttpClient 3.x 使用类似这样的东西:
Protocol.registerProtocol("https", new Protocol("https",
(ProtocolSocketFactory)secureProtocolSocketFactory, 443));
关于java - 使用 Axis2 附加客户端证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8639512/