OpenSSL支持TLS1.3特性:
TLS 1.3版本是对规范的重大修改。它到底应该叫TLS2.0还是现在的名字TLS 1.3,还存在一些争论。该版本有重大变化,一些工作方式也非常不同。下面是你可能需要注意的一些问题,简明扼要,不过并不太全面。
(1)有一些新的密码套件仅在TLS 1.3下工作。一些旧的密码套件无法用于TLS 1.3连接。
(2)新的密码套件定义方式不同,且并未详细规定证书类型(如RSA、DSA、ECDSA)(3)或密钥交换机制(如DHE或ECHDE)。这对密码套件的配置有暗示作用。
(5)客户端在客户问候消息(ClientHello)中提供一个“key_share”。这会对“组”配置产生影响。
(6)直到主握手完成以后,会话才会建立。在握手结束和会话建立之间可能会有一个间隙(理论上,会话可能根本不会建立),并可能对会话恢复代码产生影响。
(7)在TLS 1.3版本中,重新磋商是不可能的。
(8)现在大部分握手都会被加密。
(9)更多类型的消息现在可以有扩展(这对定制扩展API和证书透明系统有影响)。
(10)在TLS 1.3连接中不再允许使用DSA证书。
注意,在这一阶段,只支持TLS 1.3。因DTLS 1.3版本的规范刚刚开始制定,目前并不支持OpenSSL。
TLS 1.3标准目前的状态:
到我写这篇文章时,TLS 1.3仍是一个草案。TLS工作团队定期会发布该标准的新版草案。实际中,需要对草案进行部署来识别他们使用的具体版本,基于不同草案版本的实现之间无法交互。
OpenSSL 1.1.1至少不会在TLS 1.3发布之前完成。同时,OpenSSL的git主分支包含了我们的TLS1.3开发代码,可以用于测试(即不用于生产)。你可以在任意OpenSSL版本中通过头文件tls1.h中的宏TLS1_3_VERSION_DRAFT_TXT的值来查看部署的TLS 1.3草案的版本。在该标准的最终版发布后,这个宏会被删除。
你必须使用“enable-tls1_3”选项来“配置”(config或Configure),以编译OpenSSL,使其支持TLS 1.3。
目前,OpenSSL已执行了TLS 1.3的“20版草案”。而很多其他库仍在使用旧版草案。相当多的主流浏览器在使用“18版草案”。这是交互性问题产生的共同来源。18版草案的交互性已被BoringSSL、NSS和picotls测试过。
在OpenSSL的hit源码库中有两个分支:“tls1.3-draft-18”和“tls1.3-draft-19”,都执行旧的TLS 1.3草案版本。为测试其它TLS 1.3版本环境下的交互性,你可能需要使用其中一个分支。注意那些分支被认为是临时的,而且当将来不再需要它们时,可能会被删除。
密码套件:
OpenSSL已支持以下5种TLS 1.3的密码套件:
TLS13-AES-256-GCM-SHA384
TLS13-CHACHA20-POLY1305-SHA256
TLS13-AES-128-GCM-SHA256
TLS13-AES-128-CCM-8-SHA256
TLS13-AES-128-CCM-SHA256
其中,前三个是在默认密码套件组中。这意味着如果你没有主动对密码套件进行配置,那么你会自动使用这三个密码套件,并可以进行TLS 1.3磋商。
所有TLS 1.3密码套件也都出现在别名HIGH中。正如你预计的那样,CHACHA20、AES、AES128、AES256、AESGCM、AESCCM和AESCCM8这些密码套件别名都像它们的名称一样,且包含这些密码套件的一个子集。密钥交换和认证属性是TLS 1.2及以前版本中密码套件定义的一部分。在TLS 1.3中不再如此,所以密码套件别名(如ECHHE、ECDSA、RSA及其它相似别名)都不包含任何TLS 1.3密码套件。
如果你主动配置了你的密码套件,那么应该注意确保你没有不小心排除掉所有兼容TLS 1.3的密码套件。如果一个客户端启用了TLS 1.3而未配置TLS 1.3密码套件,那么会立即报错(即使服务器不支持TLS 1.3),出现以下提示:
140460646909376:error:141A90B5:SSLroutines:ssl_cipher_list_to_bytes:no ciphersavailable:ssl/statem/statem_clnt.c:3562:No ciphers enabled for max supportedSSL/TLS version
类似地,如果一个服务器启用了TLS 1.3而未配置TLS 1.3密码套件,那么也会立即报错,即使客户端不支持TLS 1.3,提示如下:
140547390854592:error:141FC0B5:SSLroutines:tls_setup_handshake:no ciphersavailable:ssl/statem/statem_lib.c:108:No ciphers enabled for max supportedSSL/TLS version
例如,默认设置一个密码套件选择字符串ECDHE:!COMPLEMENTOFDEFAULT,还使用ECDHE进行密钥交换。但是,ECDHE组中没有TLS 1.3密码套件,所以如果启用了TLS 1.3,那么这种密码套件配置在OpenSSL 1.1.1中将会出错。你可能要指定你想使用的TLS 1.3密码套件来避免出现问题。例如:
"TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:ECDHE:!COMPLEMENTOFDEFAULT"
你可以使用openssl ciphers-s -v命令来测试,在给定的密码套件选择字符串中包含那个密码套件
$ openssl ciphers -s -v"ECDHE:!COMPLEMENTOFDEFAULT"
确保至少有一个密码套件支持TLS 1.3
看完本文有收获?请转发分享更多人
因为分享是一种美德