如何在java / eclipse中为http客户端设置密码套件?

时间:2015-03-12 11:55:43

标签: java ssl encryption

我们的服务器刚刚将其密码套件限制为:

SSLCipherSpec ALL TLS_RSA_WITH_AES_128_GCM_SHA256 TLS_RSA_WITH_AES_256_GCM_SHA384

现在我的测试java客户端代码在服务器日志中失败并显示此消息:

SSL握手失败,未指定密码

和客户端的这个堆栈跟踪:

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
    at com.ibm.jsse2.j.a(j.java:42)
    at com.ibm.jsse2.j.a(j.java:41)
    at com.ibm.jsse2.qc.b(qc.java:485)
    at com.ibm.jsse2.qc.a(qc.java:381)
    at com.ibm.jsse2.qc.h(qc.java:453)
    at com.ibm.jsse2.qc.a(qc.java:625)
    at com.ibm.jsse2.qc.startHandshake(qc.java:113)
    at com.ibm.net.ssl.www2.protocol.https.c.afterConnect(c.java:188)
    at com.ibm.net.ssl.www2.protocol.https.d.connect(d.java:9)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1103)
    at com.ibm.net.ssl.www2.protocol.https.b.getOutputStream(b.java:84)

任何人都可以建议我在HttpURLConnection中设置什么才能让它使用这些受限制的密码套件?或者这是我需要在JVM参数中设置的东西(在Eclipse中)?

非常感谢

1 个答案:

答案 0 :(得分:2)

您明显使用IBM JSSE。根据{{​​3}}。,可以通过设置https.cipherSuites系统属性:

来完成
  

这包含一个以逗号分隔的密码套件名称列表,用于指定要在此HttpsURLConnection上启用的密码套件。

这当然是its documentation (see Customizing JSSE -> Customization)。 (如果您还需要设置协议,您可能还会发现https.protocols很有用。)

如果您希望在每个连接的基础上实现此目的,您可以使用自定义HttpsURLConnection将特定设置传递到SSLSocketFactory。通常情况下,您要实施自己的SSLSocketFactory,将所有来电委托给默认SSLSocketFactorySSLSocketFactory.getDefault())或来自自定义SSLSocketFactory的{​​{1}},但更改任何SSLContext方法创建的SSLSocket以更改设置其密码套件。这些方面的东西:

createSocket(...)

然后:

class MySSLSocketFactory {
     public Socket createSocket(...) {
         SSLSocket s = (SSLSocket) SSLSocketFactory.getDefault().createSocket(...);
         s.setEnabledCipherSuites(...);
         return s;
     }
     ...
 }

也就是说,exactly the same parameter as for the Sun/Oracle JSSE仅支持您尝试使用的两个密码套件(URLConnection urlConnection = url.openConnection(); HttpsURLConnection httpsUrlConnection = (HttpsURLConnection) urlConnection; httpsUrlConnection.setSSLSocketFactory(new MySSLSocketFactory()); TLS_RSA_WITH_AES_128_GCM_SHA256),但他们已经支持默认情况下启用,因此您不需要任何自定义。

Oracle JRE since Java 8的同一个表只有最高版本为7的列,并且根本没有列出这些密码套件。我不确定这是否只是未更新的文档的一部分,或者IBM JSSE是否不支持这些密码套件,即使在版本8中也是如此。