【问题标题】:Does the JDK/JRE version alone determine the result of SSLSocket.getSupportedProtocols()?JDK/JRE 版本是否单独决定 SSLSocket.getSupportedProtocols() 的结果?
【发布时间】:2015-10-10 01:34:12
【问题描述】:

JDK/JRE 版本是否单独决定 SSLSocket.getSupportedProtocols() 的结果?或者是否有任何其他配置/启动参数会影响此结果?

例如,如果应用程序在 JDK 1.7 update 21 上运行,此方法将返回 [SSLv2Hello, SSLv3, TLSv1, TLSv1.1, TLSv1.2]。但是如果应用在不支持 SSLv3 的 JDK 1.8 上运行,这个方法会只返回 [TLSv1, TLSv1.1, TLSv1.2] 吗?

我假设这个问题的答案也适用于默认启用列表。例如,在 JDK 1.7 更新 21 中,SSLSocket.getEnabledProtocols() 默认返回 [SSLv3, TLSv1]。那么对于 JDK 1.8,默认启用列表会是 [TLSv1.1, TLSv1.2] 吗?

【问题讨论】:

    标签: java ssl jsse


    【解决方案1】:

    没有。

    在 Java 7 之前,您只有 jdk.certpath.disabledAlgorithms 来禁用算法。

    从 Java 7 的更高版本开始,您还拥有jdk.tls.disabledAlgorithms。两者的区别似乎是jdk.tls.disabledAlgorithms也可以限制TLS/SSL版本。

    jdk.tls.legacyAlgorithms 也存在。只有在所有其他允许的协议都被拒绝后,才会使用此列表中的协议。

    在 Java 8u51 中,这些(在 Java 的 lib/security/java.security 文件中找到)的默认值是:

    jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024
    
    jdk.tls.disabledAlgorithms=SSLv3, DH keySize < 768
    
    jdk.tls.legacyAlgorithms= \
            K_NULL, C_NULL, M_NULL, \
            DHE_DSS_EXPORT, DHE_RSA_EXPORT, DH_anon_EXPORT, DH_DSS_EXPORT, \
            DH_RSA_EXPORT, RSA_EXPORT, \
            DH_anon, ECDH_anon, \
            RC4_128, RC4_40, DES_CBC, DES40_CBC
    

    【讨论】:

    • 附带说明,SSLv2 在较新的 Java 版本上已完全删除,无法使用,因此它没有出现在 jdk.tls.disabledAlgorithms 列表中。
    • 在这个 java.security 文件中配置 SSL/TLS 协议的启用/禁用是否正常?或者我应该在客户端代码中处理这个?也就是说,我会检索所有支持的协议,然后取出我不想要的协议(SSLv3、TLSv1)并 setEnabled 其余的。
    • @Zoomzoom 你真的可以做到。我做的网络开发比其他任何事情都多,而且只列出你想使用的协议/密码是很常见的。
    • 附带说明,Java 8 Security Enhancements notes 提到 Java 8 还新增了一个 jdk.tls.client.protocols 属性,可用于限制客户端将使用哪些版本的 SSL/TLS。默认为“TLSv1,TLSv1.1,TLSv1.2”
    • 当您说“这里很常见只列出您想要使用的协议/密码”时,您是在谈论 java.security 文件吗?所以更常见的是修改该文件而不是处理应用程序中的各种限制?我只是想找出最适合使用我的软件的系统管理员...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多