如何配置 Nginx 以仅使用 TLS 1.2 / 1.3
TLS 是传输层安全性的缩写。它是一种旨在提供网络通信安全性的加密协议。网站和其他应用程序(如 IM(即时通讯)、电子邮件、Web 浏览器、VoIP 等)使用 TLS 来保护其服务器和客户端之间的所有通信。本页介绍如何启用和配置 Nginx 以仅使用 TLS 1.2 和 1.3 版本。
教程要求 | |
---|---|
要求 | 使用 OpenSSL 在 Linux/Unix 上运行的 Nginx |
Root 权限 | 是的 |
难度等级 | 简单的 |
预计阅读时间 | 5 分钟 |
如何配置并启用 Nginx 以使用 TLS 1.2 和 1.3
- 打开终端应用程序
- 使用 ssh 命令登录 Nginx 服务器
- 编辑 nginx.conf 文件或虚拟域配置文件
- 通过编辑设置 TLS 版本ssl_protocols TLSv1.2;
- 对于 TLS 1.3 版本,请添加ssl_protocols TLSv1.3;
- 我们可以通过设置来组合并仅允许 Nginx 中的 TLS 1.2 和 1.3:ssl_protocols TLSv1.2 TLSv1.3;
- 保存并关闭文件
- 重新启动或重新加载 Nginx 服务器。
- 测试一下。
有关我们在 Nginx Web 服务器中仅针对 TLS 1.2 或 1.3 进行的设置的说明
我使用以下组件测试了服务器配置:
- Nginx 版本 1.14.2
- OpenSSL 版本 1.1.0
因此,此配置选项仅适用于以下客户端:
- 支持 Firefox 27+
- Android 4.4.2+
- Chrome 31+
- Windows 7 或更高版本上的 Edge、IE 11
- Java 8u31
- OpenSSL 1.0.1
- Opera 20+
- Safari 9+
换句话说,Windows XP 的旧客户端或 Android/Java 的旧版本将无法运行。
关于 TLS 1.3 的说明
TLS 1.3 仅支持 Firefox 63+、Android 10.0+、Chrome 70+、Edge 75、Java 11、OpenSSL 1.1.1、Opera 57 和 Safari 12.1。因此,我建议在 Nginx 中同时启用 1.2 和 1.3 支持。
如何检查 Nginx 版本
类型:
$ nginx -V
$ nginx -v
nginx version: nginx/1.16.1
如何检查 OpenSSL 版本
跑步:
$ openssl version
OpenSSL 1.1.1d 10 Sep 2019
如何在 Nginx Web 服务器中仅启用 TLS 1.2
编辑 nginx.conf:
$ sudo vi /etc/nginx/nginx.conf
或者编辑虚拟主机:
$ sudo vi /etc/nginx/vhosts.d/example.com
更新/附加如下:
请注意,TLSv1.1 和 TLSv1.2 参数(1.1.13、1.0.12)仅在使用 OpenSSL 1.0.1 或更高版本时才有效。TLSv1.3 参数(1.13.0)仅在使用支持 TLSv1.3 的 OpenSSL 1.1.1 时才有效。
server { listen 443 ssl http2; server_name www.example.com example.com # Path to certs ssl_certificate /etc/nginx/ssl/example.com.csr; ssl_certificate_key /etc/nginx/ssl/example.com.key; ssl_session_timeout 1d; ssl_session_cache shared:MySSL:10m; ssl_session_tickets off; ssl_dhparam /etc/nginx/ssl/example.com.dhparam.pem; ssl_protocols 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_prefer_server_ciphers off; # HSTS add_header Strict-Transport-Security "max-age=63072000" always; # OCSP stapling ssl_stapling on; ssl_stapling_verify on; # verify chain of trust of OCSP response using Root CA and Intermediate certs ssl_trusted_certificate /etc/nginx/ssl/fullchain.pem; # replace with the IP address of your resolver resolver 1.1.1.1; ## rest of config ## }
保存并关闭文件。
如何在 Nginx 中启用 TLS 1.3
对于 TLS 版本 1.2 和 1.3,请在 nginx 配置文件中使用以下内容:
ssl_protocols TLSv1.2 TLSv1.3;
只需在 nginx 中启用 TLS 版本 1.3:
ssl_protocols TLSv1.3;
以下是仅适用于 TLS 1.3 的示例配置:
server { listen 443 ssl http2; listen [::]:443 ssl http2; server www.example.com; ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/key.pem; ssl_session_timeout 1d; ssl_session_cache shared:SharedexampleSSL:10m; ssl_session_tickets off; # TLS 1.3 only ssl_protocols TLSv1.3; ssl_prefer_server_ciphers off; # HSTS (ngx_http_headers_module is required) (63072000 seconds) add_header Strict-Transport-Security "max-age=63072000" always; # OCSP stapling ssl_stapling on; ssl_stapling_verify on; # verify chain of trust of OCSP response using Root CA and Intermediate certs ssl_trusted_certificate /etc/nginx/ssl/fullchain.pem; # replace with the IP address of your resolver resolver 8.8.8.8; }
重新加载或重启 nginx
现在服务器已配置完毕。现在是时候测试我们的 nginx 配置服务器是否存在语法错误了:
$ nginx -t
示例输出:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
重新加载或者重新启动 nginx 服务器:
$ sudo systemctl restart nginx
## OR ##
$ sudo service nginx restart
测试Nginx TLS 1.2支持
运行curl命令如下(将www.example.com域名替换为您的实际域名):
$ curl -I -v --tlsv1.2 --tls-max 1.2 https://www.example.com/
测试Nginx TLS 1.3支持
$ curl -I -v --tlsv1.3 --tls-max 1.3 https://www.example.com/
* Trying 104.20.187.5:443... * TCP_NODELAY set * Connected to www.example.com (104.20.187.5) port 443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: none CApath: /etc/ssl/certs * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): * TLSv1.3 (IN), TLS handshake, Certificate (11): * TLSv1.3 (IN), TLS handshake, CERT verify (15): * TLSv1.3 (IN), TLS handshake, Finished (20): * TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1): * TLSv1.3 (OUT), TLS handshake, Finished (20): * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 * ALPN, server accepted to use h2 * Server certificate: * subject: C=US; ST=CA; L=San Francisco; O=Cloudflare, Inc.; CN=example.com * start date: Nov 28 00:00:00 2019 GMT * expire date: Oct 9 12:00:00 2020 GMT * subjectAltName: host "www.example.com" matched cert's "*.example.com" * issuer: C=US; ST=CA; L=San Francisco; O=CloudFlare, Inc.; CN=CloudFlare Inc ECC CA-2 * SSL certificate verify ok. * Using HTTP2, server supports multi-use * Connection state changed (HTTP/2 confirmed) * Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0 * Using Stream ID: 1 (easy handle 0x558d280211d0) > HEAD / HTTP/2 > Host: www.example.com > User-Agent: curl/7.65.3 > Accept: */* > * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * old SSL session ID is stale, removing * Connection state changed (MAX_CONCURRENT_STREAMS == 256)! < HTTP/2 200 HTTP/2 200 < date: Sun, 01 Dec 2019 19:51:39 GMT date: Sun, 01 Dec 2019 19:51:39 GMT < content-type: text/html; charset=UTF-8 content-type: text/html; charset=UTF-8 < set-cookie: __cfduid=d0754cfef8441ee725af158ad808a62211575229899; expires=Tue, 31-Dec-19 19:51:39 GMT; path=/; domain=.example.com; HttpOnly; Secure set-cookie: __cfduid=d0754cfef8441ee725af158ad808a62211575229899; expires=Tue, 31-Dec-19 19:51:39 GMT; path=/; domain=.example.com; HttpOnly; Secure < strict-transport-security: max-age=15552000 strict-transport-security: max-age=15552000 < x-whome: l-cbz04 x-whome: l-cbz04 < cf-cache-status: HIT cf-cache-status: HIT < age: 126265 age: 126265 < x-content-type-options: nosniff x-content-type-options: nosniff < alt-svc: h3-23=":443"; ma=86400 alt-svc: h3-23=":443"; ma=86400 < expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" < server: cloudflare server: cloudflare < cf-ray: 53e798d6081edc89-MAA cf-ray: 53e798d6081edc89-MAA < * Connection #0 to host www.example.com left intact
测试 Nginx TLS 1.1/1.0 支持(必须失败)
在这个最后的例子中,检查并使用 Nginx 使用 TLS 1.0/1.1:
$ curl -I -v --tlsv1 --tls-max 1.0 https://www.example.com/
$ curl -I -v --tlsv1.1 --tls-max 1.1 https://www.example.com/
了解 curl 命令选项
- -I:仅显示文档标题信息
- -v:详细输出
- --tlsv1,,,,:使用给定的--tlsv1.0TLS版本--tlsv1.1--tlsv1.2--tlsv1.3
- --tls-max VERSION:设置允许的最大 TLS 版本
请参阅此处的 curl手册页或输入以下 man 命令:
$ man curl
结论
您已成功配置并启用了运行在 Linux 或类 Unix 系统上的 Nginx Web 服务器的 TLS 1.{2,3}。有关详细信息,请参阅此处的 Nginx Web 服务器文档。
- 在 Debian/Ubuntu Linux 上设置 Lets Encrypt
- 在 Debian/Ubuntu 上使用 Lets Encrypt 证书保护Lighttpd
- 在Alpine Linux上使用 Lets Encrypt 证书配置Nginx
- CentOS 7上的Nginx与 Lets Encrypt
- RHEL 8上的Apache与 Lets Encrypt 证书
- CentOS 8和Apache与 Lets Encrypt 证书
- 在CentOS 8上为Nginx安装 Lets Encrypt 证书
- 强制续订 Let's Encrypt 证书
- OpenSUSE Linux和 Nginx 与 Let's Encrypt 证书
- 配置 Nginx 仅使用 TLS 1.2/1.3
- 使用 acme.sh 和Cloudflare DNS加密通配符证书
- 在 Ubuntu 18.04 上使用 Nginx 和 Let's Encrypt 进行 DNS 验证
- AWS Route 53使用 acme.sh 加密通配符证书
- 使用 acme.sh将 AWS Route 53转换为 Cloudflare Let's Encrypt DNS
- 当证书被跳过、续订或出现错误时,Let's Encrypt 电子邮件通知