Nginx HTTPS 配置解析 SSL安全 ssl_ciphers 解析

2,215次阅读
没有评论

共计 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 Compatibility
  • ssl_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)会话恢复, 默认开启. rfc5077
  • ssl_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 指定安全密码支持 Supports Firefox 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 (强密码) 参考配置

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的方法.

正文完
 4
太阳
版权声明:本站原创文章,由 太阳 2023-10-27发表,共计5346字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)