我们的系统与多个网络服务提供商进行通信。它们都是从单个 Java 客户端应用程序调用的。到目前为止,所有 Web 服务都通过 SSL,但没有一个使用客户端证书。嗯,一个新的合作伙伴正在改变这一点。
让应用程序使用证书进行调用很容易;设置 javax.net.ssl.keyStore
和 javax.net.ssl.keyStorePassword
就可以了。但是,现在的问题是如何使它只在调用该特定 Web 服务时使用证书。我想更一般地说,我们希望能够选择要使用的客户端证书(如果有的话)。
一种快速解决方案是设置系统属性、调用方法,然后取消设置。唯一的问题是我们正在处理一个多线程应用程序,所以现在我们需要处理同步或锁或者你有什么。
每个服务客户端应该彼此完全独立,并且它们被单独打包在不同的 JAR 中。因此,我想到的一个选择(尽管我们还没有正确分析它)是以某种方式隔离每个 JAR,也许将每个 JAR 加载到具有不同参数的不同 VM 下。这只是一个我不知道如何实施的想法(或者如果有可能的话,就此而言。)
这篇文章 表明可以从密钥库中选择一个单独的证书,但是如何将它附加到请求中似乎是一个完全不同的问题。
我们正在使用 Java 1.5、Axis2 和使用 wsimport
或 wsdl2java
生成的客户端类。
原文由 Carlos 发布,翻译遵循 CC BY-SA 4.0 许可协议
Java SSL 客户端只会在服务器请求时发送证书。服务器可以发送关于它将接受哪些证书的可选提示;如果客户有多个证书,这将帮助客户选择一个证书。
通常,一个新的
SSLContext
使用特定的客户端证书创建,并且Socket
实例是从从该上下文获得的工厂创建的。不幸的是,Axis2 似乎不支持使用SSLContext
或自定义SocketFactory
。它的客户端证书设置是全局的。