Java Bouncy Castle TLS 协议版本顺序?

Java Bouncy Castle TLS Protocol version order?

我正在使用 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 时,它 returns: [TLSv1.3, TLSv1.2, TLSv1.1, TLSv1, SSLv3]

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

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

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

编辑:已添加,因此附上: Perfect test site for TLS/SSL

As the client, are all of these versions communicated to the server, and the server chooses the highest that it supports?

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

If I denote a specific version SSLContext.getInstance("TLSv1.3",BCJSSE); and the server does not support that version is an exception thrown?

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

I'm trying to determine why you would ever specify a version in your call, if the negotiation will automagically determine the best match.

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

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

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

无论您如何创建 SSLContext,都可以通过 SSLSocket/SSLEngine .setEnabledProtocolsSSLParameters.setProtocols.

修改启用的协议

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

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