Java Bouncy Castle TLS协议版本顺序?



我使用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);而服务器不支持的那个版本是抛出异常吗?

我想知道你为什么要在电话中指定一个版本,如果协商将自动确定最佳匹配。

编辑:添加所以这是附加的:完美的TLS/SSL测试站点

作为客户端,是否所有这些版本都传达给服务器,并且服务器选择它支持的最高版本?

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

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

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

如果协商将自动确定最佳匹配,我想确定为什么您要在呼叫中指定一个版本。

通常只有在需要不支持低于特定版本的版本时才会这样做,即只支持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修改已启用的协议。

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

你应该用你想要支持的所有版本配置你的套接字,然后只尝试一次调用。不建议一次尝试一个版本,因为它可能使您暴露于降级攻击。

最新更新