在Java中选择SSL客户端证书

Car*_*los 25 java ssl web-services

我们的系统与多个Web服务提供商通信.它们都是从单个Java客户端应用程序调用的.到目前为止,所有Web服务都已通过SSL,但没有一个使用客户端证书.好吧,一个新的合作伙伴正在改变这一点

使应用程序使用证书进行调用很容易; 设置javax.net.ssl.keyStorejavax.net.ssl.keyStorePassword将做到这一点.但是,现在的问题是如何使它在调用特定Web服务时仅使用证书.我想更一般地说,我们希望能够选择要使用的客户端证书(如果有的话).

一个快速的解决方案是设置系统属性,调用方法,然后取消设置.唯一的问题是我们正在处理多线程应用程序,所以现在我们需要处理同步或锁定或者你有什么.

每个服务客户端应该完全相互独立,并且它们被单独打包在单独的JAR中.因此,我发现的一个选项(虽然我们没有对其进行适当的分析)是以某种方式隔离每个JAR,可能在具有不同参数的不同VM下加载每个JAR.这只是一个我不知道如何实现的想法(或者如果可能的话,那就是这个问题.)

这篇文章表明可以从密钥库中选择一个单独的证书,但如何将它附加到请求似乎完全是一个不同的问题.

我们使用的是使用wsimport或生成的Java 1.5,Axis2和客户端类wsdl2java.

Bru*_*uno 14

配置是通过一个完成的SSLContext,它实际上是SSLSocketFactory(或SSLEngine)的工厂.默认情况下,这将从javax.net.ssl.*属性配置.此外,当服务器请求证书时,它会发送一条TLS/SSL CertificateRequest消息,其中包含它愿意接受的CA的可分辨名称列表.虽然这个列表严格来说只是指示性的(即服务器可以接受不在列表中的发行者的证书,或者可以拒绝列表中CA的有效证书),但它通常以这种方式工作.

默认情况下,X509KeyManager配置中的证书选择器SSLContext(通常您不必担心它)将选择一个已由列表中的一个颁发的证书(或者可以链接到那里的发行者) .该列表是issuers参数X509KeyManager.chooseClientAlias(alias是要选择的证书的别名,如密钥库中引用的那样).如果您有多个候选者,您还可以使用该socket参数,如果有助于做出选择,它将为您提供对等方的IP地址.

如果这有帮助,您可能会发现使用jSSLutils(及其包装器)来配置您的SSLContext(这些主要是帮助类来构建SSLContexts).(请注意,此示例用于选择服务器端别名,但可以对其进行调整,源代码可用.)

完成此操作后,您应该axis.socketSecureFactory在Axis(和SecureSocketFactory)中查找有关系统属性的文档.如果您查看Axis源代码,那么构建一个org.apache.axis.components.net.SunJSSESocketFactorySSLContext您选择的内容中初始化的代码应该不会太难(请参阅此问题).

刚刚意识到你在谈论Axis2,它SecureSocketFactory似乎已经消失了.您可以使用默认值找到变通方法SSLContext,但这会影响整个应用程序(这不是很好).如果使用jSSLutils的X509KeyManagerWrapper,则可以使用默认值X509KeyManager并仅将某些主机视为例外.(这不是一个理想的情况,我不确定如何在Axis 2中使用自定义SSLContext/ SSLSocketFactory)

或者,根据此Axis 2文档,看起来Axis 2使用Apache HTTP Client 3.x:

如果要执行SSL客户端身份验证(双向SSL),可以使用HttpClient的Protocol.registerProtocol功能.如果您不想使用常规https,则可以覆盖"https"协议,或使用不同的协议进行SSL客户端身份验证通信.有关更多信息,请访问 http://jakarta.apache.org/commons/httpclient/sslguide.html

在这种情况下,SslContextedSecureProtocolSocketFactory应该帮助您配置SSLContext.


eri*_*son 8

Java SSL客户端仅在服务器请求时才发送证书.服务器可以发送关于它将接受哪些证书的可选提示; 这将有助于客户选择单个证书(如果有多个证书).

通常,SSLContext使用特定客户端证书创建new ,并Socket从从该上下文获取的工厂创建实例.不幸的是,Axis2似乎不支持使用SSLContext或自定义SocketFactory.其客户端证书设置是全局的.