MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

如何配置Nginx以支持最新的TLS版本

2024-02-085.5k 阅读

理解 TLS 版本与安全需求

在深入探讨如何配置 Nginx 支持最新 TLS 版本之前,我们需要先理解 TLS(Transport Layer Security)协议的版本演进及其重要性。TLS 是一种旨在为网络通信提供安全保障的协议,它确保数据在传输过程中的保密性、完整性和身份验证。

TLS 的早期版本,如 TLS 1.0 和 TLS 1.1,随着时间推移暴露出了一些安全漏洞。例如,TLS 1.0 存在 POODLE(Padding Oracle On Downgraded Legacy Encryption)漏洞,攻击者可以利用该漏洞解密加密的 HTTPS 流量。TLS 1.1 虽然在一定程度上改进了安全性,但也逐渐无法满足日益增长的安全威胁。

最新的 TLS 版本,如 TLS 1.3,带来了显著的安全和性能提升。TLS 1.3 简化了握手过程,减少了往返次数,从而提高了连接建立的速度。同时,它采用了更强大的加密算法和密钥交换机制,增强了安全性。例如,TLS 1.3 强制使用 AEAD(Authenticated Encryption with Associated Data)模式的加密算法,如 ChaCha20 - Poly1305,提供了更好的保密性和完整性保护。

检查 Nginx 版本支持

在开始配置 Nginx 支持最新 TLS 版本之前,首先要确认所使用的 Nginx 版本是否支持目标 TLS 版本。较旧的 Nginx 版本可能不支持最新的 TLS 协议。

可以通过以下命令检查 Nginx 版本:

nginx -v

如果 Nginx 版本较旧,需要进行升级。升级 Nginx 的方法因操作系统而异。以 Ubuntu 为例,可以通过以下步骤升级:

  1. 首先更新软件包列表:
sudo apt update
  1. 然后安装最新版本的 Nginx:
sudo apt install nginx

在 CentOS 上,升级 Nginx 可以使用 EPEL 仓库:

  1. 安装 EPEL 仓库:
sudo yum install epel - release
  1. 安装最新版本的 Nginx:
sudo yum install nginx

确保升级后再次检查版本,确认已安装支持所需 TLS 版本的 Nginx。

配置 Nginx 支持 TLS 1.3

  1. 编辑 Nginx 配置文件
    • 找到 Nginx 的主配置文件,通常在 /etc/nginx/nginx.conf/etc/nginx/sites - available/default(如果使用基于站点的配置)。
    • 使用文本编辑器,如 vim 打开配置文件:
sudo vim /etc/nginx/sites - available/default
  1. 添加 TLS 1.3 配置
    • server 块中,添加或修改 listen 指令以支持 TLS 1.3。例如:
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_protocols TLSv1.3;
    # 证书相关配置
    ssl_certificate /path/to/your/certificate.crt;
    ssl_certificate_key /path/to/your/private.key;
    # 其他配置
    server_name your_domain.com;
    location / {
        # 站点内容相关配置
        root /var/www/html;
        index index.html;
    }
}
  • 在上述配置中,ssl_protocols TLSv1.3; 明确指定了只使用 TLS 1.3 协议。如果希望同时支持 TLS 1.2 和 TLS 1.3,可以改为 ssl_protocols TLSv1.2 TLSv1.3;
  1. 选择合适的加密套件
    • TLS 1.3 有一套特定的加密套件。虽然 Nginx 会默认选择一组合理的套件,但根据具体需求,也可以手动指定。例如:
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256";
    ssl_certificate /path/to/your/certificate.crt;
    ssl_certificate_key /path/to/your/private.key;
    server_name your_domain.com;
    location / {
        root /var/www/html;
        index index.html;
    }
}
  • 这里指定的加密套件 TLS_AES_128_GCM_SHA256TLS_AES_256_GCM_SHA384TLS_CHACHA20_POLY1305_SHA256 都是 TLS 1.3 中常用且安全的套件。
  1. 启用 OCSP 装订
    • OCSP(Online Certificate Status Protocol)装订是一种机制,用于提高证书状态检查的效率和安全性。在 Nginx 中启用 OCSP 装订可以进一步增强 TLS 连接的安全性。
    • 首先,获取 OCSP 响应:
openssl ocsp -issuer /path/to/issuer.crt -cert /path/to/your/certificate.crt -url http://ocsp.example.com -respout ocsp.resp
  • 然后,将 OCSP 响应包含在 Nginx 配置中:
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256";
    ssl_certificate /path/to/your/certificate.crt;
    ssl_certificate_key /path/to/your/private.key;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    ssl_trusted_certificate /path/to/issuer.crt;
    ssl_stapling_file /path/to/ocsp.resp;
    server_name your_domain.com;
    location / {
        root /var/www/html;
        index index.html;
    }
}
  • 在上述配置中,ssl_stapling on; 启用了 OCSP 装订,ssl_stapling_verify on; 确保验证 OCSP 响应的有效性。resolver 指令指定了 DNS 解析器,用于验证 OCSP 响应。ssl_trusted_certificate 指向证书颁发机构的证书,ssl_stapling_file 指向获取的 OCSP 响应文件。

配置 Nginx 支持 TLS 1.2(可选)

虽然 TLS 1.3 是更安全和高效的选择,但在某些情况下,可能仍需要支持 TLS 1.2 以兼容旧的客户端。

  1. 编辑 Nginx 配置文件
    • 打开 Nginx 配置文件,如 sudo vim /etc/nginx/sites - available/default
  2. 添加 TLS 1.2 支持
    • 确保 ssl_protocols 指令包含 TLSv1.2。例如:
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers "ECDHE - RSA - AES128 - GCM - SHA256:ECDHE - RSA - AES256 - GCM - SHA384:DHE - RSA - AES128 - GCM - SHA256:DHE - RSA - AES256 - GCM - SHA384:ECDHE - RSA - AES128 - SHA256:ECDHE - RSA - AES256 - SHA384:ECDHE - RSA - AES128 - SHA:ECDHE - RSA - AES256 - SHA:DHE - RSA - AES128 - SHA256:DHE - RSA - AES256 - SHA256:DHE - RSA - AES128 - SHA:DHE - RSA - AES256 - SHA:ECDHE - RSA - DES - CBC3 - SHA:EDH - RSA - DES - CBC3 - SHA:AES128 - GCM - SHA256:AES256 - GCM - SHA384:AES128 - SHA256:AES256 - SHA256:AES128 - SHA:AES256 - SHA:DES - CBC3 - SHA:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
    ssl_certificate /path/to/your/certificate.crt;
    ssl_certificate_key /path/to/your/private.key;
    server_name your_domain.com;
    location / {
        root /var/www/html;
        index index.html;
    }
}
  • 上述 ssl_ciphers 配置了一组适用于 TLS 1.2 的加密套件。这组套件经过精心挑选,以确保安全性和兼容性。避免使用弱加密算法,如 DESRC4 等,这些算法已被证明存在安全风险。

安全强化配置

  1. 启用 HTTP/2
    • HTTP/2 不仅提供了性能提升,还与 TLS 紧密结合,增强了安全性。确保在 listen 指令中包含 http2。例如:
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    # 其他 TLS 和服务器配置
}
  1. 设置安全头
    • 添加安全头可以进一步增强网站的安全性。例如,添加 Strict - Transport - Security(HSTS)头:
server {
    # 其他配置
    add_header Strict - Transport - Security "max - age = 31536000; includeSubDomains; preload";
    # 其他安全头配置
    add_header X - Frame - Options SAMEORIGIN;
    add_header X - Content - Type - Options nosniff;
    add_header X - XSS - Protection "1; mode = block";
}
  • Strict - Transport - Security 头告知浏览器在一定时间内(这里设置为一年,即 31536000 秒)只通过 HTTPS 访问该网站,并且包括子域名。X - Frame - Options 头防止网站被嵌入到其他框架中,防止点击劫持攻击。X - Content - Type - Options 头防止浏览器进行 MIME 类型嗅探,避免恶意脚本执行。X - XSS - Protection 头启用浏览器的跨站脚本攻击保护。
  1. 防止缓存敏感内容
    • 如果网站包含敏感内容,应防止其被缓存。可以通过设置 Cache - ControlPragma 头来实现:
server {
    location /sensitive - path {
        add_header Cache - Control "no - cache, no - store, must - revalidate";
        add_header Pragma "no - cache";
        add_header Expires "0";
    }
}
  • 上述配置确保在 /sensitive - path 路径下的内容不会被缓存,包括在代理服务器和客户端浏览器中。

测试与验证

  1. 语法检查
    • 在重启 Nginx 之前,先进行语法检查,确保配置文件没有错误。可以使用以下命令:
sudo nginx -t
  • 如果语法检查通过,会显示 nginx: configuration file /etc/nginx/nginx.conf test is successful。如果有错误,根据提示修改配置文件。
  1. 重启 Nginx
    • 语法检查通过后,重启 Nginx 使配置生效:
sudo systemctl restart nginx
  1. 使用在线工具验证
    • 可以使用在线工具,如 SSL Labs 的 SSL Server Test(https://www.ssllabs.com/ssltest/)来验证 Nginx 配置是否正确支持最新的 TLS 版本。输入网站域名后,工具会对服务器的 SSL/TLS 配置进行全面测试,并给出详细报告。
    • 报告中会显示支持的 TLS 版本、加密套件、安全头设置等信息。确保 TLS 1.3 被正确支持,并且没有安全风险提示。例如,检查是否存在弱加密算法、是否正确配置了 HSTS 等安全头。
  2. 使用浏览器验证
    • 在不同的浏览器中访问网站,确保网站能够正常加载,并且浏览器的安全指示器显示连接是安全的。现代浏览器通常会在地址栏附近显示锁形图标,表示安全连接。同时,可以查看浏览器的开发者工具,在 Security 标签中查看连接使用的 TLS 版本和加密套件等详细信息。

故障排除

  1. Nginx 启动失败

    • 如果重启 Nginx 时失败,可以查看 Nginx 的错误日志。在 Ubuntu 上,错误日志通常位于 /var/log/nginx/error.log,在 CentOS 上位于 /var/log/nginx/error.log
    • 例如,如果是因为配置文件语法错误导致启动失败,日志中会显示类似 nginx: [emerg] unexpected end of input, expecting ";" 的错误信息,根据提示修改配置文件。
  2. TLS 1.3 不被支持

    • 确认 Nginx 版本是否确实支持 TLS 1.3。如果版本过旧,升级 Nginx。
    • 检查 ssl_protocols 指令是否正确配置。确保没有拼写错误,并且 TLSv1.3 被正确包含在指令中。
    • 检查加密套件配置是否与 TLS 1.3 兼容。不兼容的加密套件可能导致 TLS 1.3 无法正常协商。
  3. OCSP 装订问题

    • 如果 OCSP 装订出现问题,首先检查获取 OCSP 响应的过程是否正确。确保 openssl ocsp 命令的参数正确,并且 OCSP 服务器地址有效。
    • 检查 Nginx 配置中与 OCSP 装订相关的指令,如 ssl_staplingssl_stapling_verifyresolver 等是否正确配置。错误的 DNS 解析器配置可能导致无法验证 OCSP 响应。
  4. 安全头未正确设置

配置示例综合展示

以下是一个完整的 Nginx 配置示例,综合展示了支持最新 TLS 版本(TLS 1.2 和 TLS 1.3)、启用 HTTP/2、设置安全头以及 OCSP 装订的配置:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE - RSA - AES128 - GCM - SHA256:ECDHE - RSA - AES256 - GCM - SHA384:DHE - RSA - AES128 - GCM - SHA256:DHE - RSA - AES256 - GCM - SHA384:ECDHE - RSA - AES128 - SHA256:ECDHE - RSA - AES256 - SHA384:ECDHE - RSA - AES128 - SHA:ECDHE - RSA - AES256 - SHA:DHE - RSA - AES128 - SHA256:DHE - RSA - AES256 - SHA256:DHE - RSA - AES128 - SHA:DHE - RSA - AES256 - SHA:ECDHE - RSA - DES - CBC3 - SHA:EDH - RSA - DES - CBC3 - SHA:AES128 - GCM - SHA256:AES256 - GCM - SHA384:AES128 - SHA256:AES256 - SHA256:AES128 - SHA:AES256 - SHA:DES - CBC3 - SHA:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
    ssl_certificate /path/to/your/certificate.crt;
    ssl_certificate_key /path/to/your/private.key;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    ssl_trusted_certificate /path/to/issuer.crt;
    ssl_stapling_file /path/to/ocsp.resp;
    add_header Strict - Transport - Security "max - age = 31536000; includeSubDomains; preload";
    add_header X - Frame - Options SAMEORIGIN;
    add_header X - Content - Type - Options nosniff;
    add_header X - XSS - Protection "1; mode = block";
    server_name your_domain.com;
    location / {
        root /var/www/html;
        index index.html;
    }
}

通过上述步骤和配置,能够有效地配置 Nginx 以支持最新的 TLS 版本,提高后端开发中网站的安全性和性能。在实际应用中,还需要根据具体的业务需求和安全策略进行适当调整。同时,持续关注 TLS 协议的发展和安全动态,及时更新配置,确保网站始终处于安全状态。