【问题标题】:Java webservice client, change client certificate dynamicallyJava webservice客户端,动态更改客户端证书
【发布时间】:2012-04-27 16:05:09
【问题描述】:

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

【问题讨论】:

    标签: java web-services certificate keystore


    【解决方案1】:

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

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

    【讨论】:

    • 我尝试使用他们的 SSLSocketFactory,但它与javax.net.ssl.SSLSocketFactory 不兼容。我得到一个ClassCastExceptionorg.apache.http.conn.ssl.SSLSocketFactory cannot be cast to javax.net.ssl.SSLSocketFactory 最简单的方法是什么?
    • @hpityu 您使用什么库来调用 Web 服务?您不能只将 Apache SSLSocketFactory 实例放到期望 javax.net.ssl.SSLSocketFactory 的某个地方。它设计用于 Apache 提供的HttpClient。根据您的应用程序,您可能能够 (1) 重写您的客户端代码以使用 HttpClient,或 (2) 编写一个适配器来包装 Apache SSLSocketFactory 以实现 javax.net.ssl.SSLSocketFactory
    猜你喜欢
    • 2010-09-16
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2015-08-07
    • 1970-01-01
    • 2010-12-12
    • 2013-06-06
    相关资源
    最近更新 更多