写在前面
本文主要按照 Mozilla 对于服务端 TLS 协议配置的建议来提供 nginx 的配置建议,按照这些建议进行配置可以让我们的站点更加安全。
适用于个人站点的配置
如果你的站点无需向后兼容(老旧的浏览器、客户端和操作系统),那么这是整个建议中最安全的配置。所以十分适合个人站点,比如个人博客。
server {
......
# 启用 HSTS。
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
# 仅启用 TLS 1.3 协议。
ssl_protocols TLSv1.3;
ssl_conf_command MinProtocol TLSv1.3;
# 启用建议的加密套件,这些套件均支持前向安全性。
ssl_conf_command Ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256;
# 启用建议的 ECC 曲线。
ssl_ecdh_curve X25519:prime256v1:secp384r1;
......
}
适用于绝大多数站点的配置
如果你需要兼容过去五年内发布的应用程序(如浏览器),下面是建议的配置。
server {
......
# 启用 HSTS。
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
# 仅启用 TLS 1.2 和 TLS 1.3 协议。
ssl_protocols TLSv1.2 TLSv1.3;
ssl_conf_command MinProtocol TLSv1.2;
# 启用建议的加密套件,这些套件均支持前向安全性。
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:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_conf_command Ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256;
# 启用建议的 ECC 曲线。
ssl_ecdh_curve X25519:prime256v1:secp384r1;
......
}
升级你的 Openssl
请将你的 Openssl 升级到 1.1.1k 或以上的版本,之前的版本已经被爆出了两个漏洞,详见 OpenSSL Security Advisory [25 March 2021]。一个漏洞可以进行 DoS 攻击,另一个则可以进行中间人攻击。
你可以通过运行命令 nginx -V
来查看你的 nginx 编译时用的 openssl 的版本,或者运行时使用的版本。你应该能看到下面这行,请保证运行时所使用 openssl 的版本在 1.1.1k 及以上,如果没有括号里的内容请确保编译时所使用的 openssl 的版本在 1.1.1k 及以上
built with OpenSSL 1.1.1i 8 Dec 2020 (running with OpenSSL 1.1.1k 25 Mar 2021)
前向安全性
简单来说如果某一天你的服务器上的证书私钥泄露了,你之前的通信也无法被解密,你需要做的只是换一个证书而已。
谢谢。在前几个版本,nginx一直都不能调整TLS1.3的密码套件的顺序。全网都找不到资料,只有你这里给出的范例有用。