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 密码的主要内容,如果未能解决你的问题,请参考以下文章

exchange2010开启tls1.2

k8s nginx ingress配置TLS

Windows Server 2008 R2 添加 TLS1.2 支持

不接受支持的协议怎么访问网站

VS2013无法正常使用Nuget的解决方案

jdk1.6 支持 tls1.2协议 并忽略身份验证