修改Nginx的加密套件(ssl_ciphers)参数以提高传输过程中的安全性

一次进行SSL检测时发现,有不少的“Cipher Suites”处于“WEAK”状态,为了让其全绿显得更安全些,遂决定修改Nginx所使用加密套件。

边缘Nginx

之前的前端节点加密套件的配置如下:

EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5

安全协议:TLSv1.2TLsv1.3

检查结果:
配置为“EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5 ”的结果

看着有几个WEAK的密码套件,经过搜索后修改为:

ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305

安全协议保持不变,重新检查后的结果:
配置为“ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305”的结果

此时发现之前在安全协议去掉的TLsv1.1还一直说支持的,在我修改了加密套件后才显示不支持。就是不知道这样算不算是“激进的”会导致旧设备不支持。

在SSL Configuration Generator网站上根据需求给出的建议配置是:

ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305

但在配置上发现给出的结果与上一条相差无异,没有提供更多的兼容性。

源站Nginx

反正都改了边缘节点的安全套件,干脆一并把源站的也给修改。

修改前为:

    ssl_protocols       TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers        "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

修改后为:

    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers        "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305";

新增参数:

    # 使用更安全的椭圆曲线
    ssl_ecdh_curve secp384r1;

其中在直接访问源站的链路中,新增secp384r1相关配置后,密钥交换机制从X25519变成了P-384。想着把secp384r1修改成secp521r1是不是更安全?没想到修改后Chrome浏览器直接无法访问(使用了不受支持的协议,ERR_SSL_VERSION_OR_CIPHER_MISMATCH,客户端和服务器不支持一般 SSL 协议版本或加密套件。),但通过自建的边缘Nginx或者是CDN后还能正常访问。

最后

最后糅合一下给边缘节点配置为:

ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305

至于CDN节点就无法详细的进一步配置了,源站节点甚至可以配置成只支持TLSv1.3的说!

参考

SSL Configuration Generator
https://ssl-config.mozilla.org/

在Nginx中启用安全的SSL/TLS密码套件,涵盖基础配置、兼容性处理、证书管理、性能优化等内容
https://www.zhifeiya.cn/post/2025/5/1/9afa68f2

ChiuYut

2025年07月19日

发布者

ChiuYut

咦?我是谁?这是什么地方? Ya ha!我是ChiuYut!这里是我的小破站!