【问题标题】:Java Bouncy Castle TLS Protocol version order?Java Bouncy Castle TLS 协议版本顺序?
【发布时间】:2021-05-13 09:33:39
【问题描述】:

我正在使用 Java Bouncy Castle TLS 库 (bctls-jdk15to18-1.68.jar)。当我调用 SSLContext.getInstance 时,我指定了“TLS”和 BCJSSE 提供程序:

final SSLContext context    =   SSLContext.getInstance("TLS",BCJSSE);
                 context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), keyStoreSalter);
logger.debug(Arrays.toString(context.getSupportedSSLParameters().getProtocols()));

当我查询上下文的 SupportedSSLParameters 时,它返回:[TLSv1.3, TLSv1.2, TLSv1.1, TLSv1, SSLv3]

作为客户端,是否所有这些版本都与服务器通信,服务器选择它支持的最高版本?

如果我表示特定版本SSLContext.getInstance("TLSv1.3",BCJSSE); 并且服务器不支持该版本是否抛出异常?

如果协商会自动确定最佳匹配,我正在尝试确定您为什么会在通话中指定版本。

编辑:添加所以附上: Perfect test site for TLS/SSL

【问题讨论】:

    标签: java ssl cryptography bouncycastle


    【解决方案1】:

    作为客户端,是否所有这些版本都与服务器通信,服务器选择它支持的最高版本?

    客户端只需告知支持哪些版本(TLS 1.3 supported_versions 扩展)或宣布它可以做的最好的版本(TLS 1.2 及更低版本)。然后服务器简单地选择客户端和服务器都支持的最高协议版本。

    如果我表示特定版本 SSLContext.getInstance("TLSv1.3",BCJSSE);并且服务器不支持该版本是否抛出异常?

    如果客户端和服务器不支持通用协议版本,则握手失败并抛出异常。

    如果协商会自动确定最佳匹配,我正在尝试确定您为什么会在通话中指定版本。

    这通常仅在需要不支持特定版本以下的版本时才会这样做,即仅支持 TLS 1.2 及更高版本。由于 TLS 1.0 在某些情况下已经被认为太弱,这可能是现实世界的要求。

    【讨论】:

    • 如果我调用 SSLContext.getInstance("TLSv1.3",BCJSSE),与服务器通信的是什么?如果服务器不支持 TLSv1.3,是否会引发异常,在这种情况下,我可以捕获该异常并再次尝试使用 SSLContext.getInstance("TLSv1.2",BCJSSE) 上线?如果客户端传达它支持的版本并且服务器选择它支持的最高版本,那么这就是我所说的优先顺序。
    • 我将编辑我的问题,使我的意思在技术上更准确。
    • @ZacWolf:现在的答案符合你想问的吗?
    • 好的,谢谢! (小修改:“弱”=“太弱”,也许改写最后一位?“TLS 1.0 已经被认为太弱了,在某些用例中,TLS 1.1 也是如此。”
    【解决方案2】:

    在 JSSE API 的上下文中“支持”表示它受此 JSSE 实现支持,因此可以启用,但不是默认启用。如果您想查看新的SSLSocket 或SSLEngine 上启用的实际协议,请在其上调用getEnabledProtocols 方法。

    然后,您可以根据用于构建SSLContext 的算法来试验哪些“支持”协议实际上是自动启用的。值得注意的是,仅指定“TLS”不会在 v1.68 中自动启用 TLSv1.3(因为它是第一个支持 TLSv1.3 的版本,我们很谨慎)。 SSLv3 也永远不会自动启用。

    无论您如何创建SSLContext,启用的协议都可以通过SSLSocket/SSLEngine .setEnabledProtocols 或SSLParameters.setProtocols 进行修改。

    所有启用的协议都与服务器通信,服务器选择它支持的最高协议。 (粗略地说,有些服务器可能会先协商密码套件,然后再检查合适的协议版本)。

    您应该使用您想要支持的所有版本配置您的套接字,然后尝试一次调用。一次尝试一个版本是不可取的,因为它可能会让您接触到downgrade attack。

    【讨论】:

    • 感谢您提供此信息!所以如果我(作为客户端)想让服务器知道这些是我愿意使用的协议,我可以添加socket.setEnabledProtocols(new String[] {"TLSv1.3", "TLSv1.2", "TLSv1.1"});? [假设这些条目包含在context.getSupportedSSLParameters().getProtocols() 中作为“支持”与]
    • 是的,或者您可以使用 SSLSocket.getSupportedProtocols 代替。可能还值得阅读/扫描 JSSE 参考指南以获取概述:docs.oracle.com/en/java/javase/15/security/…。
    猜你喜欢
    • 1970-01-01
    • 2023-02-09
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多