NGINX 不支持 tls1.2 密码
Posted
技术标签:
【中文标题】NGINX 不支持 tls1.2 密码【英文标题】:NGINX not supporting tls1.2 ciphers 【发布时间】:2020-12-22 23:47:29 【问题描述】:我想在 nginx (v1.16.1) 中添加一些 TLS 1.2 密码,其中只有 2 个有效。
以下是我希望获得支持的密码列表。
DHE-RSA-AES128-GCM-SHA256;
ECDHE-RSA-AES128-GCM-SHA256; --> 这行得通
DHE-RSA-AES256-GCM-SHA384;
ECDHE-RSA-AES256-GCM-SHA384; --> 这行得通
ECDHE-ECDSA-AES256-GCM-SHA384;
在default.conf中添加以下行
server
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers off;
ssl_ciphers "DHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-GCM-SHA256 DHE-RSA-AES256-GCM-SHA384 ECDHE-RSA-AES256-GCM-SHA384 ECDHE-ECDSA-AES256-GCM-SHA384";
...
我正在使用 open ssl 命令来测试它们
openssl s_client -cipher DHE-RSA-AES128-GCM-SHA256 -connect localhost:8443 -tls1_2
openssl s_client -cipher ECDHE-RSA-AES128-GCM-SHA256 -connect localhost:8443 -tls1_2
openssl s_client -cipher DHE-RSA-AES256-GCM-SHA384 -connect localhost:8443 -tls1_2
openssl s_client -cipher ECDHE-RSA-AES256-GCM-SHA384 -connect localhost:8443 -tls1_2
openssl s_client -cipher ECDHE-ECDSA-AES256-GCM-SHA384 -connect localhost:8443 -tls1_2
一个标记的作品给出了结果,其余的都失败了,如下所示
openssl s_client -cipher DHE-RSA-AES128-GCM-SHA256 -connect localhost:8443 -tls1_2
CONNECTED(00000218)
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 118 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1599152280
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no
---
36400:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:../openssl-1.1.1d/ssl/record/rec_layer_s3.c:1543:SSL alert number 40
我的配置有问题还是不支持密码。
【问题讨论】:
对于 TLS1.2 及以下版本,您需要在文件中创建(或获取)一组 DH 参数,specify it using ssl_dhparam 否则“将不使用 DHE 密码”。openssl dhparam $nbits
是一种生成合适参数的简单方法。 (ECDHE 不同,因为它使用标准化曲线,而不是用户可定义的组。)
【参考方案1】:
对于 Diffie Hellman 密钥交换,您需要向 nginx 提供dhparam
:
openssl dhparam -out /etc/ssl/certsdhparam.pem 4096
并在 nginx conf 中配置:
ssl_dhparam /etc/ssl/certs/dhparam.pem;
见reference
对于ECDHE-ECDSA-AES256-GCM-SHA384;
,您还需要使用 ecdsa 密钥和证书。见guide
混合 RSA 和 ECDSA 证书示例配置:
ssl_certificate /path/to/rsa.crt;
ssl_certificate_key /path/to/rsa.key;
ssl_certificate /path/to/ecdsa.crt;
ssl_certificate_key /path/to/ecdsa.key;
见reference
【讨论】:
非常感谢,前 4 个密码有效,但最后一个 ECDHE-ECDSA-AES256-GCM-SHA384 仍然无效,我在这里错过了什么。以上是关于NGINX 不支持 tls1.2 密码的主要内容,如果未能解决你的问题,请参考以下文章