我有以下问题。我有一个 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 服务时如何动态更改客户端证书?