共计 5346 个字符,预计需要花费 14 分钟才能阅读完成。
前言
在互联网时代,安全性成为了网站运营中至关重要的一个方面。随着网络攻击技术的不断发展,网站管理员需要采取各种措施来保护用户的数据和隐私。其中,采用HTTPS协议是一种常见且有效的保护手段。HTTPS(HyperText Transfer Protocol Secure)是HTTP的加密版本,通过SSL/TLS协议对数据进行加密传输,确保数据在传输过程中不被窃取或篡改。
Nginx是一个高性能的开源HTTP和反向代理服务器,它支持HTTPS协议,并且提供了丰富的配置选项,使得管理员可以轻松配置HTTPS连接。本文将介绍Nginx中的HTTPS配置,性能优化以及常见问题的解决方法。
Nginx官方示例配置
以下配置参考 Nginx 文档 – ngx_http_ssl_module 模块章节
worker_processes auto;
http {
; ...
server {
listen 443 ssl;
keepalive_timeout 70;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
ssl_certificate /usr/local/nginx/conf/cert.pem;
ssl_certificate_key /usr/local/nginx/conf/cert.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
; ...
}
; ...
}
其中参数为:
worker_processes
auto 为设置Nginx的工作进程数量为等于处理器的数量,也可以指定一个数字, 默认为1.keepalive_timeout
70 限制通过一个保持活动连接可以处理请求的最长时间单位秒. 达到此时间后, 连接将在后续请求处理后关闭, 默认为75. 可根据服务器负载进行调整一般设置65.ssl_protocols
指定服务器接受连接的ssl协议版本默认为TLSv1 TLSv1.1 TLSv1.2 TLSv1.3
.ssl_ciphers
指定启用的密码, 密码以OpenSSL库可以理解的格式指定, 默认ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
Nginx 多次修改过这个默认值详见Nginx Configuring Compatibilityssl_certificate
证书路径,文件通常为pem,crt后缀并不重要它是一个文本文件,可以用文本编辑器打开里面包含-----BEGIN CERTIFICATE-----
即为证书文件.ssl_certificate_key
证书密钥文件pem,key后缀,同上内部包含-----BEGIN PRIVATE KEY-----
即为密钥文件ssl_session_cache
设置存储会话参数的缓存的类型和大小。默认off
无缓存, 为shared
所有工作进程之间共享的缓存,SSL
为缓存的名称,10m
为大小,1MB可以存储大约 4000 个会话。ssl_session_timeout
指定客户端可以重用会话参数的时间默认五分钟.
通用示例建议配置
worker_processes auto;
http {
; ...
server {
listen 443 ssl;
keepalive_timeout 60;
ssl_certificate /usr/local/nginx/conf/cert.pem;
ssl_certificate_key /usr/local/nginx/conf/cert.key;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
; ...
}
; ...
}
调优建议:
keepalive_timeout
根据官方建议设置超时连接时间通常设置为60秒.ssl_protocols
配置TLSv1.1 TLSv1.2 TLSv1.3
去除TLSv1
的支持, 现在基本已经很难见到只支持TLSv1
协议的客户端设备了.ssl_session_timeout
ssl会话超时时间可以设定为1d一天, 可极大的减少ssl握手所消耗的cpu算力.ssl_session_cache
会话缓存大小设置为多进程共享shared:SSL:10m;
根据服务器内存大小可以适当再增大缓存.- 若采用通用做法可不再设置更多参数,采用当前你使用的Nginx版本的默认配置, 兼容多数浏览器软件.
Nginx SSL 安全性配置 ssl_ciphers 解析
在上方的通用配置中去除了ssl_ciphers
参数的配置,表示采用Nginx的默认参数. 一般在通用性网站上通常不对它进行配置,它的设定和你的网站想要采用的安全性等级有关. Nginx各个版本更新也会根据时下的安全更新进行通用性以及安全性上的调整.
当我们对网站的ssl
安全性有强制要求时可有以下有以下工具可以帮助我们配置 ssl
的安全等级.
Mozilla 安全配置器
Mozilla 安全配置器官网 | server-side-tls 存储库 | Mozilla Server_Side_TLS 文档
这个是由 Mozilla 运营安全和企业信息安全团 维护此文档作为浏览 TLS 环境的参考指南,以及协助系统管理员的配置生成器。 以下是 ssl-config
所生成的 Nginx 中等推荐安全配置.
# generated 2023-10-27, Mozilla Guideline v5.7, nginx 1.17.7, OpenSSL 1.1.1k, intermediate configuration, no HSTS, no OCSP
# https://ssl-config.mozilla.org/#server=nginx&version=1.17.7&config=intermediate&openssl=1.1.1k&hsts=false&ocsp=false&guideline=5.7
server {
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /path/to/signed_cert_plus_intermediates;
ssl_certificate_key /path/to/private_key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
# curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
ssl_dhparam /path/to/dhparam;
# intermediate configuration
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:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
}
其中参数为
ssl_session_tickets
关闭无服务器端状态的传输层安全(TLS)会话恢复, 默认开启. rfc5077ssl_dhparam
指定Diffie-Hellman
参数,这是一种用于密钥交换的加密算法。配置 Diffie-Hellman 参数可以提高 SSL/TLS 的安全性。, ssl-config 提供了这个文件 ffdhe2048.txt. 仓库dhe_groups 提供了ffdhe3072
,ffdhe4096
. 缺点是这中密钥交换方法比较消耗计算资源.ssl_protocols
限制只支持TLSv1.2 TLSv1.3
版本连接. 目前来说只支持TLSv1.1
协议连接的设备也非常非常少见了.ssl_ciphers
指定安全密码支持 SupportsFirefox 27, Android 4.4.2, Chrome 31, Edge, IE 11 on Windows 7, Java 8u31, OpenSSL 1.0.1, Opera 20, and Safari 9
以上的设备连接.ssl_prefer_server_ciphers
关闭要求服务器密码优先于客户端密码保证一定程度兼容性.(默认关闭)
注意在最新版本 nginx/1.25.2 中 listen 选项中的 http2 参数已经被删除了, 要开启 http2 使用选项
http2 on;
代替
Cipherli.st (强密码) 参考配置
worker_processes auto;
http {
; ...
server {
; ...
listen 443 ssl;
listen [::]:443 ssl;
ssl_protocols TLSv1.3;# Requires nginx >= 1.13.0 else use TLSv1.2
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem; # openssl dhparam -out /etc/nginx/dhparam.pem 4096
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
resolver $DNS-IP-1 $DNS-IP-2 valid=300s;
resolver_timeout 5s;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
; ...
}
; ...
}
说明:
ssl_protocols TLSv1.3
只开启TLSv1.3
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
使用强密码ssl_ecdh_curve secp384r1;
为ECDHE密码指定secp384r1
ssl_session_tickets off
关闭ticket
续期ssl_stapling on; ssl_stapling_verify;
验证证书
这个网站提供了一个强密码验证的参考, 通常这种配置服务与高安全项目的内网环境中使用. 并不适合公开开放网络使用. 这些配置只有最新的设备最新的浏览器才支持.
SSL安全验证工具
wormly 官网 输入你要检查的可公网访问的网站连接, 可查看当前配置支持的加密方法情况,并给与一定建议.
ssllabs 的检测比较详细 给与的建议偏向保守 能够给出比较详细的检测过程信息
额外参数
- ssl_reject_handshake: 如果启用,服务器块中的 SSL 握手将被拒绝。 默认 off 该指令出现在 1.19.4 版中。 本质需求就是为了当机器人或者奇怪的人类通过HTTPS访问你的IP时不暴露证书,也就不会暴露域名。建议在新版本Nginx都将这个参数设置为on; 这个功能的设定位置是在http下监听默认的 443端口访问设置
worker_processes auto;
http {
; ...
server {
; ...
listen 443 ssl default_server;
ssl_reject_handshake on;
; ...
}
; ...
}
- ssl_prefer_server_ciphers on|off 作用:是否由服务器决定采用哪种加密算法
ssl_prefer_server_ciphers
只针对于tlsv1 tls1.1
总结
本文详细讨论了在nginx中网站使用SSL证书开启HTTPS的相关配置,包括ssl_session_timeout,ssl_session_cache等参数的推荐配置. 其中详细讲解了ssl_ciphers选项的配置, 提供了相关工具, 探讨了在注重安全网站中配置HTTPS的方法.