【问题标题】:Force JVM to use certain Cipher for https connections强制 JVM 为 https 连接使用特定密码
【发布时间】:2016-03-12 05:01:05
【问题描述】:

我有 Java 客户端,它使用 https 连接到某些 Web 服务。客户端的要求之一是,我们应该能够从支持的密码套件列表中进行选择,然后强制客户端使用它们。

来自以下page

  • https.cipherSuites 系统属性。这包含以逗号分隔的密码套件名称列表,指定要启用的密码套件 用于此 HttpsURLConnection。请参阅 SSLSocket setEnabledCipherSuites(String[]) 方法。

但是当我设置这个 JVM 属性并列出默认密码时。我得到了标准启用的密码列表,与不使用此属性时相同。

我用来列出启用的密码的代码:

SSLSocketFactory factory = HttpsURLConnection.getDefaultSSLSocketFactory();
SSLSocket socket = (SSLSocket) factory.createSocket();

String[] enabledCiphers = socket.getEnabledCipherSuites();

for (String enabledCipher : enabledCiphers) {
    System.out.println("Enabled Ciphers: " + enabledCipher);
}

使用以下方式设置属性:

-Dhttps.cipherSuites=SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA,SSL_DHE_DSS_WITH_DES_CBC_SHA

有什么建议吗?

【问题讨论】:

    标签: java ssl


    【解决方案1】:

    此系统属性仅影响默认的 https 客户端代码;不是密码的全部列表,即任何使用HttpsURLConnection 的东西都将由https.cipherSuites 值控制。

    没有特别详细的记录 - 它在 sun.net.www.protocol.https 的源代码中,并且在 the jsse reference guide 中明确指出:

    https.cipherSuites 系统属性。这包含一个以逗号分隔的密码套件名称列表,指定启用哪些密码套件以在此 HttpsURLConnection 上使用。

    如果你想完全覆盖套接字工厂,你可以创建一个类来做同样的事情 - this answer 做出了合理的尝试。

    【讨论】:

      猜你喜欢
      • 2014-01-21
      • 1970-01-01
      • 2013-09-24
      • 2017-05-05
      • 2012-02-24
      • 2016-01-02
      • 2014-05-06
      • 1970-01-01
      相关资源
      最近更新 更多