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 实现支持它,因此可以启用它,但不是默认情况下启用它。如果您想查看在新 SSLSocket
或 SSLEngine
上启用的实际协议,请对其调用 getEnabledProtocols
方法。
然后您可以根据您用于构建 SSLContext
的算法试验哪些“支持的”协议实际上是自动启用的。值得注意的是,仅指定“TLS”不会在 v1.68 中自动启用 TLSv1.3(因为它是第一个支持 TLSv1.3 的版本,我们对此持谨慎态度)。此外,永远不会自动启用 SSLv3。
无论您如何创建 SSLContext
,都可以通过 SSLSocket/SSLEngine .setEnabledProtocols
或 SSLParameters.setProtocols
.
修改启用的协议
所有启用的协议都与服务器通信,服务器选择它支持的最高协议。 (粗略地说;有些服务器可能会先协商密码套件,然后检查合适的协议版本)。
您应该使用您想要支持的所有版本配置您的套接字,然后尝试一次调用。一次尝试一个版本是不可取的,因为它可能会给您带来 downgrade attack.
我正在使用 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 实现支持它,因此可以启用它,但不是默认情况下启用它。如果您想查看在新 SSLSocket
或 SSLEngine
上启用的实际协议,请对其调用 getEnabledProtocols
方法。
然后您可以根据您用于构建 SSLContext
的算法试验哪些“支持的”协议实际上是自动启用的。值得注意的是,仅指定“TLS”不会在 v1.68 中自动启用 TLSv1.3(因为它是第一个支持 TLSv1.3 的版本,我们对此持谨慎态度)。此外,永远不会自动启用 SSLv3。
无论您如何创建 SSLContext
,都可以通过 SSLSocket/SSLEngine .setEnabledProtocols
或 SSLParameters.setProtocols
.
所有启用的协议都与服务器通信,服务器选择它支持的最高协议。 (粗略地说;有些服务器可能会先协商密码套件,然后检查合适的协议版本)。
您应该使用您想要支持的所有版本配置您的套接字,然后尝试一次调用。一次尝试一个版本是不可取的,因为它可能会给您带来 downgrade attack.