安全的TLS协议

在实际应用中,应用不安全的密码协议可能会导致被黑客攻击,因此本文从各个角度给出不同安全级别的密码套件推荐。

1 算法结构安全性分析

1625552647924

1) 密钥交换算法

密钥交换算法是用于交换对称密钥的公钥系统

Examples: ECDHE, DHE, RSA, ECDH, DH,ADH,PSK

RSA,ECDH,DH,PSK均不具有前向安全性,一旦私钥丢失,则以往所有的通信内容将会泄露,使用前向安全性算法(ECDHE,DHE),可以避免这种问题。

ADH为Anonymous DH,匿名DH算法,不提供身份验证,禁用。

PSK算法是预存key在客户端和服务端,因为PSK必须要预置密钥,这个预置的过程就代表了服务端已经知道有哪些客户端需要访问了,所以基于PSK的TLS适合在内部系统中使用,而不适合在公网环境用来提供Web服务。

另外,因为DH1024 在理论上是可以破解(Logjam攻击)的,虽然破解难度和成本极大,但是也存在一定的风险,所以要求使用DH-2048且 不是初始默认值.

推荐使用安全密钥交换算法:ECDHE,DHE(2048)

2)身份认证算法

服务器在 SSL/TLS 握手中使用的算法来签署(使用服务器的私钥)在协商中发送给客户端的算法。

客户端可以使用服务器的公钥对它们进行身份验证。

Examples include: RSA, ECDSA, DSS (aka DSA), and Anonymous.

DSA只支持1024bits,不安全算法

推荐使用安全认证算法:RSA(2048以上)、ECDSA

3)加密算法

一种更改消息以使其保密的方法。

Examples: DES (Data Encryption Standard), 3DES (Triple DES), AES (Advanced Encryption Standard), ChaCha20,RC4 (Rivest Cipher 4), Camellia, ARIA,RC6, RC2, Blowfish, Twofish, IDEA, SEED, GOST, Rijndael, Serpent, MARS, etc.

ChaCha20是一种流加密算法,实现较为简单,并且比纯软件实现的AES性能更好。

在支持AES指令的硬件平台上,推荐优先选择AES-GCM算法,不支持AES指令的硬件平台,ChaCha20性能优于AES

Camellia算法支持128比特的分组长度,128、192和256比特的密钥与AES的接口相同,Camellia算法128比特密钥的加、解密过程共有18轮,采用Feistel结构,加、解密过程完全相同,只是子密钥注入顺序相反

Camellia算法由NTT和Mitsubishi Electric Corporation于2000年联合开发,作为欧洲新一代的加密标准。与AES算法相比,Camellia算法在各种软硬件平台上表现出与之相当的加密速度。除了在各种软件和硬件平台上的高效性这一显著特点,它的另外一个特点是针对小规模硬件平台的设计

推荐使用安全的加密算法:AES256, ChaCha20, Camellia

4) 密码工作模式

例如:CBC and GCM

GCM 代表 Galois/Counter Mode,一种比 CBC 更高级的操作模式。

它还对困扰 CBC 的攻击类别免疫,例如填充(野兽、幸运 13 等)

AES-GCM 的主要缺点是它仅在 TLSv1.2 修订版中添加,因此任何不支持 TLSv1.2 的旧客户端都无法使用它。

推荐使用安全的工作模式:GCM

5) MAC(Hash Function)

简而言之,MAC 提供消息完整性。 散列函数包括 MD5、SHA-1(又名 SHA)、SHA-2(又名 SHA128、SHA256 和 SHA384)和 AEAD(具有关联数据的身份验证加密)。 MD5 早已变得完全不安全并且已被弃用。 SHA-1 现在正受到浏览器的“羞辱”,因为它成为加密攻击进步的受害者。 鼓励尽快迁移到 SHA-2。

SHA1存在碰攻击,如果HTTPS证书使用sha1,则会存在中间人攻击;

推荐使用安全的Hash算法:sha256,sha384

如下几个过时的加密原语必须禁止使用:

(1)匿名Diffie-Hellman(ADH)套件不提供身份验证。

(2)NULL加密套件不提供加密。

(3)导出加密套件在连接协商时不安全,但也可以针对更强大的套件(FREAK攻击)的服务器使用。

(4)弱密码(通常为40和56位)的套件使用可以轻松被攻击。

(5)RC4是不安全的。

(6)3DES运行缓慢且易被攻击。

2 SSL/TLS协议安全

SSL/TLS系列中有五种协议:SSL 2,SSL 3,TLS 1.0,TLS 1.1,TLS 1.2和TLS1.3。

SSL2和SSL3已经非常过时了,建议不要使用。从理论上来讲,TLS 1.0也不应该被使用,但在实践中经常被使用。截至目前,TLS 1.1,1.2和TLS1.3都还没有什么安全问题,但只有 1.2提供了现代的加密算法。所以TLS 1.2应该是被使用的主要协议,因为它是唯一提供现代认证加密(也称为AEAD)的版本

TLS1.3协议:从2014年4月,第0份TLS 1.3草案公开,到2017年7月第21份草案发布,TLS 1.3的编写工作已经进入尾声,跨时3年的编写,让该协议成为有史以来最安全、也是最复杂的TLS协议。2018年6月15日,IETF发布 TLS v1.3 draft 23,正式的RFC虽然尚未发布,TLS 1.3已经开始被国内外一些网站使用,Chrome、Firefox、OpenSSL、Nginx等均提供了相应支持,TLS 1.3已经悄然进入我们的生活

推荐使用安全的协议:TLS1.2,TLS1.3

3 算法套安全级别划分

算法套的安全级别可以分为高中低三个等级,每个级别的算法套也按安全级别从搞到低排序

HIGH

“高级别”加密密码套件。 这目前意味着密钥长度大于 128 位的那些密码套件,以及一些具有 128 位密钥的密码套件。

MEDIUM

“中等”加密密码套件,目前其中一些使用 128 位加密。

LOW

低强度加密密码套件,目前使用 64 或 56 位加密算法但不包括导出密码套件。 从 OpenSSL 1.0.2g 开始,这些在默认构建中被禁用。

4 TLS1.2 安全密码套推荐

4.0 根据证书去选择密码套件

当服务器配置ECC证书时,加密套件只能选择XXX_ECDSA_XXX或者ECDH_XXX。

当服务器配置RSA证书时,只能选择RSA_XXX或者ECDHE_RSA_XXX形式的加密套件。

需要注意的是,如果加密套件选择ECDH_RSA或者ECDH_ECDSA时,由于ECDH加密套件默认表明了握手需要ECC证书(即ECC证书的公钥充当握手中server key exchange中的公钥,证书的私钥同样也是握手过程中的私钥,握手过程不需要server key exchange),所有第二部分RSA和ECDSA表明的是想要的上级签发该类型的服务器证书。

如果加密套件选择ECDHE_XXXX,则第二部分RSA和ECDSA指的是用来签名握手中server key exchange中传过来的秘密值的签名算法。

4.1 密码套件选择原则

  • 支持的SSL/TLS版本:TLS1.2,TLS1.3(禁用SSLV3 TLS1.0和TLS1.1)
  • 密钥交换算法禁用DH,ADH,优选DHE(2048)和ECHDE,保留RSA(原则上禁用)
  • 认证算法使用:RSA和ECDSA,禁用none
  • 对称加密算法使用:AES, Camellia, ChaCha20, 禁用DES, 3DES, RC4,SEED
  • 工作模式推荐:AES-GCM, ChaCha20_POLY1305,j禁用CBC
  • MAC算法:SHA384,SHA256,禁用SHA1,MD5

4.2 TLS1.2 安全密码套件

针对TLS1.2,推荐以下3种程度安全要求的密码套件:

(1)TLS1.2密码套件中满足前向安全性,禁用CBC的算法套推荐如下所示

TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 RSA证书
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 RSA证书
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 RSA证书
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 RSA证书
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 ecc证书
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 ecc证书

(2)在1的安全要求下,考虑效率,因为DHE算法效率低,通常不建议。则满足前向安全,禁用CBC,保证高效率推荐的算法套如下所示:

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

(3)在(2)的要求基础上,严格意义上128位的加密算法AES并不能保证安全性,对于安全性要求高的,则满足前向安全,禁用CBC,密码长度要求的,保证高效率推荐的算法套如下所示:

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

5 Web服务配置

5.1 nginx配置

在安装目录下,修改配置文件

白名单形式(注意此ciphersuite格式只适用于Nginx,Tomcat的格式是TLS_XXX_XXX_WITH_XXX_XXX_XXX_XXX):tls1.3加3套tls1.2

Ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:!DSS;

黑名单形式:

​ HIGH:aNULL:!ADH:!DH:!DSA:!DES:!3DES:!SEED:!RC4:!MD5:!CBC;

备注:

因为nginx是否支持TLS1.3,取决于编译依赖的openssl库是否支持TLS1.3; 且需要重新编译,添加依赖项;所以nginx服务器是否支持TLS1.3的算法套,不仅需要配置还需要编译时加入TLS1.3的依赖。

5.2 Tomcat配置

白名单,可以参考配置:

sslProtocol=”TLSv1.3,TLSv1.2”
SSLCipherSuite=”TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,

TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
黑名单:

sslProtocol=”TLSv1.3,TLSv1.2”
SSLCipherSuite=”HIGH:!MD5!EXP:!NULL:!ADH:!CBC:!DH:!DSS”

参考:

使用 TLS v1.2 及更早版本配置密码套件列表

附录:所有密码套件

TLS1.3 密码套件

TLS13-AES128-GCM-SHA256
TLS13-AES256-GCM-SHA384
TLS13-CHACHA20-POLY1305-SHA256
TLS13-AES128-CCM-SHA256
TLS13-AES128-CCM-8-SHA256

TLS1.2 密码套件

TLS_RSA_WITH_NULL_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_DH_RSA_WITH_AES_128_CBC_SHA256
TLS_DH_RSA_WITH_AES_256_CBC_SHA256
TLS_DH_RSA_WITH_AES_128_GCM_SHA256
TLS_DH_RSA_WITH_AES_256_GCM_SHA384
TLS_DH_DSS_WITH_AES_128_CBC_SHA256
TLS_DH_DSS_WITH_AES_256_CBC_SHA256
TLS_DH_DSS_WITH_AES_128_GCM_SHA256
TLS_DH_DSS_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
TLS_DHE_DSS_WITH_AES_128_GCM_SHA256
TLS_DHE_DSS_WITH_AES_256_GCM_SHA384
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_DH_anon_WITH_AES_128_CBC_SHA256
TLS_DH_anon_WITH_AES_256_CBC_SHA256
TLS_DH_anon_WITH_AES_128_GCM_SHA256
TLS_DH_anon_WITH_AES_256_GCM_SHA384
文章目录
  1. 1 算法结构安全性分析
  2. 2 SSL/TLS协议安全
  3. 3 算法套安全级别划分
  4. 4 TLS1.2 安全密码套推荐
    1. 4.0 根据证书去选择密码套件
    2. 4.1 密码套件选择原则
    3. 4.2 TLS1.2 安全密码套件
  5. 5 Web服务配置
    1. 5.1 nginx配置
    2. 5.2 Tomcat配置
  6. 参考:
  7. 附录:所有密码套件