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

时间:2012-04-16 10:11:27

标签: java web-services certificate keystore

我有以下问题。我有一个webservice,它有可以通过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 和客户端证书,服务器确实正确验证了我的请求) 。我究竟做错了什么?如何在调用webservices时动态更改客户端证书?

1 个答案:

答案 0 :(得分:3)

我怀疑发生的是你正在使用一些方法,它使用默认的JSSE SSLContext作为其SSL套接字工厂。从documentation看来,SSL上下文仅在首次创建时配置一次,并且在首次使用后设置系统属性无效。

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