Java webservice客户端,动态更改客户端证书

标签 java web-services certificate keystore

我遇到以下问题。我有一个 Web 服务,它具有可以通过 SSL 调用的端点,还有一些端点只能通过使用客户端证书来对客户端进行身份验证来调用。问题是我想动态更改客户端证书。 我的代码是:

System.setProperty("javax.net.ssl.trustStore", "cacerts.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
//...
// first web service call, without client side certificate -> OK
//...
System.setProperty("javax.net.ssl.trustStore", "cacerts.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
System.setProperty("javax.net.ssl.keyStore", "keystore1.jks");
System.setProperty("javax.net.ssl.keyStoreType", "JKS");
System.setProperty("javax.net.ssl.keyStorePassword", "password");
//...
// second web service call

我的问题是在第二次通话时。这里我得到一个异常:

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

如果我只运行代码的第二部分,一切都很好,它工作完美(所以我确实有带有客户端证书的keystore.jks,并且服务器确实正确验证了我的请求) 。我究竟做错了什么?如何在调用Web服务时动态更改客户端证书?

最佳答案

我怀疑正在发生的事情是您正在使用某种方法,该方法为其 SSL 套接字工厂使用默认的 JSSE SSLContext 。来自documentation看来 SSL 上下文仅在首次创建时配置一次,并且在首次使用后设置系统属性不起作用。

我建议使用 Apache HttpClient。他们的SSLSocketFactory实现允许对 keystore 和信任库进行编程自定义,以用于与该工厂建立的连接。最重要的是,HttpClient 为您提供了比 JDK 开箱即用的任何功能和配置选项更多的功能和配置选项。

关于Java webservice客户端,动态更改客户端证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10172216/

相关文章:

java - 在左对齐的 JTabbedPane 上强制水平制表 rune 本

java - Wicket 口组件工具提示中的延迟

java - 从 REST 中的资源路径获取占位符值?

java - 在 WebSphere Application Server 8.5 中禁用 JAX-WS 客户端的分块传输编码

objective-c - kSecTrustResultRecoverableTrustFailure 的原因是什么?

c++ - KSP( key 存储提供程序)未通过凭据提供程序在登录时加载

java - 如果用户未在逗号分隔的系列中输入整数值

JavaPlot 图形仅使用一半 Canvas

web-services - c3p0 回滚事务而不是提交

certificate - 如何在 Linux 上创建自己的通配符证书?