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

标签 java ssl encryption

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

SSLCipherSpec 所有 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 中)中设置的东西吗?

非常感谢

最佳答案

您显然在使用 IBM JSSE。根据its documentation (see Customizing JSSE -> Customization) ., 这可以通过设置 https.cipherSuites 系统属性来完成:

This contains a comma-separated list of cipher suite names specifying which cipher suites to enable for use on this HttpsURLConnection.

这当然是exactly the same parameter as for the Sun/Oracle JSSE . (如果您还需要设置协议(protocol),您可能还会发现 https.protocols 很有用。)

如果您想在每个连接的基础上实现此目的,您可以使用自定义 SSLSocketFactory 将特定设置传递给您的 HttpsURLConnection。通常,您会实现自己的 SSLSocketFactory,将所有调用委托(delegate)给默认的 SSLSocketFactory (SSLSocketFactory.getDefault()) 或 SSLSocketFactory 来自自定义 SSLContext,但更改由任何 createSocket(...) 方法创建的 SSLSocket 以更改其设置密码套件。沿着这些线的东西:

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

然后:

URLConnection urlConnection = url.openConnection();
HttpsURLConnection httpsUrlConnection = (HttpsURLConnection) urlConnection;
httpsUrlConnection.setSSLSocketFactory(new MySSLSocketFactory());

也就是说,您尝试使用的两个密码套件(TLS_RSA_WITH_AES_128_GCM_SHA256TLS_RSA_WITH_AES_256_GCM_SHA384)仅在 Oracle JRE since Java 8 中受支持,但它们已默认启用,因此您不需要任何自定义。

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

关于java - 如何在 java/eclipse 中为 http 客户端设置密码套件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29009124/

相关文章:

Java 泛型方法约束 - 从约束中排除类型以防止删除问题?

Java XML处理实体问题?

ssl - Heroku 上的空操作测功机

java - 在java中使用两个分隔符获取值

java - 在 Java 中通过 HashMap 搜索多个键

python - cyclone (python) 是否支持 HTTPS 连接和 SSL?

带套接字 tcp 的 C# ssl/tls

java - 生产环境加密异常

JavaScript AES 加密

encryption - 生成 aes256 cbc key 时使用 SHA1 作为消息摘要