在实际应用中,应用不安全的密码协议可能会导致被黑客攻击,因此本文从各个角度给出不同安全级别的密码套件推荐。
1 算法结构安全性分析
Examples: ECDHE, DHE, RSA, ECDH, DH,ADH,PSK
RSA,ECDH,DH,PSK均不具有前向安全性 ,一旦私钥丢失,则以往所有的通信内容将会泄露,使用前向安全性算法(ECDHE,DHE),可以避免这种问题。
ADH为Anonymous DH,匿名DH算法,不提供身份验证,禁用。
另外,因为DH1024 在理论上是可以破解(Logjam攻击)的,虽然破解难度和成本极大,但是也存在一定的风险,所以要求使用DH-2048且 不是初始默认值.
服务器在 SSL/TLS 握手中使用的算法来签署(使用服务器的私钥)在协商中发送给客户端的算法。
Examples include: RSA, ECDSA, DSS (aka DSA), and Anonymous.
ChaCha20是一种流加密算法,实现较为简单,并且比纯软件实现的AES性能更好。
在支持AES指令的硬件平台上,推荐优先选择AES-GCM算法,不支持AES指令的硬件平台,ChaCha20性能优于AES
推荐使用安全的加密算法: AES256, ChaCha20, Camellia
GCM 代表 Galois/Counter Mode,一种比 CBC 更高级的操作模式。
它还对困扰 CBC 的攻击类别免疫,例如填充(野兽、幸运 13 等)
AES-GCM 的主要缺点是它仅在 TLSv1.2 修订版中添加,因此任何不支持 TLSv1.2 的旧客户端都无法使用它。
SHA1存在碰攻击,如果HTTPS证书使用sha1,则会存在中间人攻击;
(1)匿名Diffie-Hellman(ADH)套件不提供身份验证。
(3)导出加密套件在连接协商时不安全,但也可以针对更强大的套件(FREAK攻击)的服务器使用。
(4)弱密码(通常为40和56位)的套件使用可以轻松被攻击。
2 SSL/TLS协议安全
SSL/TLS系列中有五种协议:SSL 2,SSL 3,TLS 1.0,TLS 1.1,TLS 1.2和TLS1.3。
3 算法套安全级别划分
算法套的安全级别可以分为高中低三个等级,每个级别的算法套也按安全级别从搞到低排序
“高级别”加密密码套件。 这目前意味着密钥长度大于 128 位的那些密码套件,以及一些具有 128 位密钥的密码套件。
低强度加密密码套件,目前使用 64 或 56 位加密算法但不包括导出密码套件。 从 OpenSSL 1.0.2g 开始,这些在默认构建中被禁用。
4 TLS1.2 安全密码套推荐
4.0 根据证书去选择密码套件
当服务器配置ECC证书时,加密套件只能选择XXX_ECDSA_XXX或者ECDH_XXX。
当服务器配置RSA证书时,只能选择RSA_XXX或者ECDHE_RSA_XXX形式的加密套件。
如果加密套件选择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 安全密码套件
(1)TLS1.2密码套件中满足前向安全性,禁用CBC的算法套推荐如下所示
(2)在1的安全要求下,考虑效率,因为DHE算法效率低,通常不建议。则满足前向安全,禁用CBC,保证高效率推荐的算法套如下所示:
(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
HIGH:aNULL:!ADH:!DH:!DSA:!DES:!3DES:!SEED:!RC4:!MD5:!CBC;
5.2 Tomcat配置
sslProtocol=”TLSv1.3,TLSv1.2”
SSLCipherSuite=”TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
sslProtocol=”TLSv1.3,TLSv1.2”
SSLCipherSuite=”HIGH:!MD5!EXP:!NULL:!ADH:!CBC:!DH:!DSS”
参考:
附录:所有密码套件
TLS13-AES128-GCM-SHA256
TLS13-AES256-GCM-SHA384
TLS13-CHACHA20-POLY1305-SHA256
TLS13-AES128-CCM-SHA256
TLS13-AES128-CCM-8-SHA256
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