Nginx 基础:HTTPS 配置详解 – wiki基地


Nginx 基础:HTTPS 配置详解

在当今的互联网环境中,数据安全和用户隐私变得前所未有的重要。HTTP (HyperText Transfer Protocol) 作为传统的网页传输协议,其传输的数据是明文的,容易被窃听和篡改。为了解决这个问题,HTTPS (HyperText Transfer Protocol Secure) 应运而生。HTTPS 在 HTTP 的基础上加入了 SSL/TLS (Secure Sockets Layer/Transport Layer Security) 协议,通过加密传输、身份认证和数据完整性校验,极大地提高了网络通信的安全性。

Nginx 作为一款高性能、高可靠性的 Web 服务器和反向代理服务器,在全球范围内得到了广泛应用。为 Nginx 配置 HTTPS 是现代网站部署的基础操作之一。本文将详细介绍在 Nginx 中配置 HTTPS 的各个方面,从基本概念到高级优化,帮助您全面掌握 Nginx 的 HTTPS 配置。

一、HTTPS 与 SSL/TLS 基础

在深入 Nginx 配置之前,有必要先了解 HTTPS 和 SSL/TLS 的基本工作原理。

  1. HTTPS 的作用:

    • 数据加密: 防止传输过程中的数据被窃听。即使数据包被截获,没有密钥也无法解密内容。
    • 身份认证: 验证服务器的真实身份,防止用户访问到仿冒的“钓鱼”网站。这通常通过受信任的证书颁发机构 (CA, Certificate Authority) 签发的 SSL/TLS 证书来实现。
    • 数据完整性: 确保数据在传输过程中没有被篡改。通过消息认证码 (MAC) 等机制进行校验。
  2. SSL/TLS 协议:

    • SSL (Secure Sockets Layer) 是较早的版本,目前已被证明存在安全漏洞,强烈不推荐使用
    • TLS (Transport Layer Security) 是 SSL 的继任者,目前广泛使用的是 TLS 1.2 和 TLS 1.3 版本。TLS 1.0 和 TLS 1.1 也被认为不够安全,应尽量禁用。
    • 工作流程 (简化版):
      • 握手阶段 (Handshake): 客户端和服务器协商将要使用的 TLS 版本、加密套件 (Cipher Suite),并交换证书以验证身份,最后生成用于后续通信的对称会话密钥。
      • 记录阶段 (Record): 使用握手阶段生成的会话密钥,对应用层数据 (如 HTTP 请求/响应) 进行加密和解密,并添加 MAC 保证完整性。
  3. SSL/TLS 证书:

    • 作用: 核心作用是证明服务器的身份,并包含用于加密协商的公钥。
    • 组成: 通常包含服务器域名、公钥、证书颁发机构信息、有效期、签名等。
    • 类型:
      • 域名验证 (DV, Domain Validated): 只验证域名的所有权,签发速度快,成本低 (甚至免费,如 Let’s Encrypt)。
      • 组织验证 (OV, Organization Validated): 除了域名所有权,还需要验证申请组织的真实性。
      • 扩展验证 (EV, Extended Validation): 最严格的验证,浏览器地址栏通常会显示绿色标识和组织名称,提供最高级别的信任。
    • 证书链 (Certificate Chain): 浏览器验证证书时,会检查其签发者,并递归向上检查签发者的证书,直到找到一个操作系统或浏览器内置的受信任的根 CA 证书。这个过程涉及到的证书序列就是证书链(服务器证书 -> 中级证书 -> 根证书)。因此,配置 HTTPS 时,通常需要提供服务器证书以及所有必要的中级证书。
    • 文件格式: 常见的证书文件格式是 PEM (Privacy-Enhanced Mail),它是 Base64 编码的 ASCII 文本文件,通常以 .pem, .crt, .cer.key (私钥) 为扩展名。Nginx 主要使用 PEM 格式的证书和私钥。

二、获取 SSL/TLS 证书

配置 HTTPS 的第一步是获取有效的 SSL/TLS 证书。主要有以下几种途径:

  1. 向商业 CA 购买:

    • 优点:提供多种证书类型 (DV, OV, EV),通常有较好的技术支持和赔付保证。
    • 缺点:需要付费,价格从几十美元到几百甚至上千美元不等。
    • 流程:选择 CA -> 生成 CSR (Certificate Signing Request) -> 提交 CSR 和验证信息 -> CA 审核并签发证书 -> 下载证书文件。
  2. 使用 Let’s Encrypt (免费 CA):

    • 优点:完全免费,自动化程度高 (通过 ACME 协议),被所有主流浏览器信任。
    • 缺点:只提供 DV 证书,证书有效期为 90 天 (需要配置自动续期)。
    • 推荐工具:Certbot
      • Certbot 是一个由 EFF (Electronic Frontier Foundation) 维护的自动化工具,可以方便地获取和续订 Let’s Encrypt 证书,并能自动配置 Nginx 或 Apache。
      • 安装 Certbot (以 Ubuntu/Debian 为例):
        bash
        sudo apt update
        sudo apt install certbot python3-certbot-nginx
      • 获取并自动配置 Nginx:
        bash
        # 替换 your_domain.com 和 www.your_domain.com 为你的域名
        sudo certbot --nginx -d your_domain.com -d www.your_domain.com

        Certbot 会引导你完成验证过程(通常是 HTTP-01 或 DNS-01 挑战),成功后会自动修改 Nginx 配置文件以启用 HTTPS,并设置定时任务进行自动续期。
      • 仅获取证书 (手动配置 Nginx):
        bash
        sudo certbot certonly --nginx -d your_domain.com -d www.your_domain.com

        证书文件通常会存放在 /etc/letsencrypt/live/your_domain.com/ 目录下,包含 fullchain.pem (服务器证书 + 中级证书) 和 privkey.pem (私钥)。
  3. 使用自签名证书:

    • 优点:完全免费,生成简单快速,适用于内部测试、开发环境。
    • 缺点:不被浏览器和操作系统信任,访问时会弹出安全警告,绝对不适用于公共网站
    • 生成方法 (使用 OpenSSL):
      bash
      # 生成私钥 (key) 和自签名证书 (crt),有效期 365 天
      sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
      -keyout /etc/ssl/private/nginx-selfsigned.key \
      -out /etc/ssl/certs/nginx-selfsigned.crt

      在生成过程中会要求输入一些信息 (国家、省份、组织名等),对于自签名证书,这些信息可以随意填写,但 Common Name (CN) 最好填写你的服务器域名或 IP 地址。

三、Nginx 基本 HTTPS 配置

假设你已经获得了证书文件(例如,服务器证书 your_domain.crt 和私钥 your_domain.key,或者 Let’s Encrypt 的 fullchain.pemprivkey.pem),接下来就可以在 Nginx 中配置 HTTPS 了。

Nginx 的配置文件通常位于 /etc/nginx/nginx.conf/etc/nginx/conf.d/ 目录下(或 /etc/nginx/sites-available//etc/nginx/sites-enabled/)。

一个基本的 HTTPS server 块配置如下:

“`nginx
server {
# 监听 80 端口 (HTTP)
listen 80;
# 监听 IPv6 的 80 端口 (可选)
listen [::]:80;
server_name your_domain.com www.your_domain.com;

# 强制将所有 HTTP 请求重定向到 HTTPS
location / {
    return 301 https://$host$request_uri;
}

}

server {
# 监听 443 端口并启用 SSL/TLS
listen 443 ssl http2;
# 监听 IPv6 的 443 端口并启用 SSL/TLS (可选)
listen [::]:443 ssl http2;
server_name your_domain.com www.your_domain.com;

# === SSL/TLS 配置 ===
# 指定服务器证书文件 (PEM 格式)
# 如果使用 Let's Encrypt, 通常是 fullchain.pem
# 如果是商业 CA, 可能需要将服务器证书和中级证书合并成一个文件
ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;

# 指定服务器私钥文件 (PEM 格式)
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;

# (可选但推荐)包含推荐的 SSL/TLS 参数文件
# 这通常包含更安全的协议、密码套件等设置
# Certbot 可能会自动创建类似 include /etc/letsencrypt/options-ssl-nginx.conf;
# 或者你可以手动创建和管理
# include snippets/ssl-params.conf; # 示例路径

# === 其他常规配置 ===
root /var/www/your_domain.com/html; # 网站根目录
index index.html index.htm index.nginx-debian.html;

location / {
    try_files $uri $uri/ =404;
}

# 其他 location 块, 如 PHP-FPM 配置等
# location ~ \.php$ {
#     include snippets/fastcgi-php.conf;
#     fastcgi_pass unix:/run/php/php8.1-fpm.sock; # 根据你的 PHP 版本调整
# }

# 访问日志和错误日志
access_log /var/log/nginx/your_domain.com.access.log;
error_log /var/log/nginx/your_domain.com.error.log;

}
“`

关键指令解释:

  • listen 443 ssl;: 指示 Nginx 在 443 端口监听 HTTPS 连接。ssl 参数是启用 SSL/TLS 的关键。
  • http2: 推荐加上 http2 参数以启用 HTTP/2 协议,它可以显著提高 HTTPS 连接的性能。浏览器普遍要求 HTTP/2 必须运行在 TLS 之上。
  • server_name: 指定此 server 块处理哪些域名。
  • ssl_certificate: 指定服务器证书文件的路径。这个文件应该包含服务器的公钥证书,并且强烈建议包含所有必需的中级 CA 证书。将服务器证书和中级证书按顺序(服务器证书在前,中级证书在后)合并到一个文件中(通常命名为 fullchain.pemchained.crt)是最常见的做法。
  • ssl_certificate_key: 指定服务器私钥文件的路径。这个文件必须严格保密,权限应设置为只有 root 用户和 Nginx 运行用户可读 (例如 600 或 640)。
  • return 301 https://$host$request_uri;: 在 HTTP (port 80) 的 server 块中,使用 301 Moved Permanently 状态码将所有 HTTP 请求永久重定向到对应的 HTTPS URL。这是确保所有流量都走 HTTPS 的标准做法。$host 变量包含请求头中的 Host 字段,$request_uri 包含请求的路径和查询参数。

配置检查与重载:

每次修改 Nginx 配置后,务必先检查语法是否正确,然后平滑地重载配置:

“`bash

检查配置文件语法

sudo nginx -t

如果显示 “syntax is ok” 和 “test is successful”,则重载配置

sudo systemctl reload nginx

或者使用: sudo service nginx reload

或者: sudo /etc/init.d/nginx reload

“`

如果 nginx -t 报错,请根据错误提示仔细检查配置文件。

四、增强 HTTPS 安全性与性能优化

仅仅启用 HTTPS 是不够的,还需要进行一系列配置来增强安全性和优化性能。这些配置通常放在 HTTPS 的 server 块内,或者提取到一个单独的文件中(如 snippets/ssl-params.conf)然后使用 include 指令引入。

  1. 选择安全的 SSL/TLS 协议版本:

    • 禁用已知不安全的协议版本 (SSLv3, TLSv1.0, TLSv1.1)。推荐只启用 TLS 1.2 和 TLS 1.3。
      nginx
      ssl_protocols TLSv1.2 TLSv1.3;
    • TLS 1.3 相较于 TLS 1.2 有更强的安全性和更好的性能(握手更快)。
  2. 配置安全的加密套件 (Cipher Suites):

    • 加密套件定义了握手和数据传输过程中使用的加密算法、身份验证算法和密钥交换算法。应优先选择安全性高、性能好的套件,并禁用已知存在漏洞的套件(如使用 MD5、SHA1、RC4 的套件,以及匿名、NULL 加密套件)。
    • 推荐参考 Mozilla 的 SSL Configuration Generator (https://ssl-config.mozilla.org/) 来获取推荐的配置。
    • 一个比较现代且安全的配置示例 (优先使用 TLS 1.3 套件,并为 TLS 1.2 选择强套件):
      “`nginx

    TLS 1.3 ciphers (由 OpenSSL 自动处理,通常无需显式指定,但可用于控制顺序)

    ssl_ciphers TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256; # OpenSSL 1.1.1+

    TLS 1.2 ciphers (强安全性优先)

    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 on;
    ``
    * **注意:** 上述
    ssl_ciphers` 字符串是一个示例,实际应根据你的 OpenSSL 版本和安全要求进行调整。使用 Mozilla 生成器是更可靠的方式。

  3. 启用 Perfect Forward Secrecy (PFS):

    • PFS 确保即使服务器的长期私钥泄露,过去的会话密钥也不会被破解,从而保护历史通信内容。它通过在每次会话中使用临时的、一次性的密钥交换算法(如 DHE 或 ECDHE)来实现。
    • 使用 Diffie-Hellman 参数 (DHE): 需要生成一个强的 DH 参数文件。
      bash
      # 生成 2048 位的 DH 参数文件 (可能需要几分钟)
      sudo openssl dhparam -out /etc/nginx/dhparam.pem 2048

      然后在 Nginx 配置中指定:
      nginx
      ssl_dhparam /etc/nginx/dhparam.pem;
    • 使用椭圆曲线 Diffie-Hellman (ECDHE): ECDHE 比 DHE 性能更好,是现代加密套件的首选。在 Nginx 1.11.0 及更高版本中,可以通过 ssl_ecdh_curve 指令指定优先使用的曲线。通常使用 prime256v1 (也称为 secp256r1) 或更安全的 secp384r1。OpenSSL 1.0.2+ 默认会选择合适的曲线,一般无需显式配置,除非你想强制使用特定曲线。
      nginx
      # Nginx 1.11.0+ (OpenSSL 1.0.2+)
      # 通常默认值即可,如果需要指定:
      # ssl_ecdh_curve prime256v1:secp384r1; # 或者只用 'auto' (Nginx 1.11.0+)
    • 关键点: 确保你选择的 ssl_ciphers 列表包含了支持 PFS 的套件(通常是以 ECDHE-DHE- 开头的)。
  4. 启用 HTTP Strict Transport Security (HSTS):

    • HSTS 是一个安全策略机制,通过一个 HTTP 响应头 (Strict-Transport-Security) 告诉浏览器,在未来一段时间内,该网站只能通过 HTTPS 访问。这可以有效防止 SSL 剥离攻击 (SSL Stripping)。
      “`nginx

    HSTS (有效期 6 个月: 15552000 秒)

    add_header Strict-Transport-Security “max-age=15552000; includeSubDomains” always;

    如果想加入 HSTS 预加载列表 (需要谨慎考虑):

    add_header Strict-Transport-Security “max-age=63072000; includeSubDomains; preload” always;
    ``
    *
    max-age: 浏览器强制使用 HTTPS 的时间(秒)。建议设置较长的时间(如 6 个月或 1 年)。
    *
    includeSubDomains: 可选参数,表示此策略也适用于所有子域名。
    *
    preload: 可选参数,表示你希望将你的域名加入到主流浏览器的 HSTS 预加载列表中。**一旦加入,移除过程非常困难,请确保你的所有子域名都已完全支持 HTTPS 且长期不会切换回 HTTP,否则可能导致用户无法访问。**
    *
    always`: 确保即使在 Nginx 内部错误页面(如 404, 50x)也会发送此头部。

  5. 启用 OCSP Stapling:

    • OCSP (Online Certificate Status Protocol) 用于检查证书是否已被吊销。浏览器默认会向 CA 的 OCSP 服务器查询,这会增加延迟并可能暴露用户的浏览行为。
    • OCSP Stapling 允许服务器定期从 CA 获取其证书的 OCSP 响应,并在 TLS 握手时将其“钉”在证书旁边发送给客户端。这提高了性能和隐私性。
      “`nginx

    OCSP Stapling

    ssl_stapling on;
    ssl_stapling_verify on;

    指定用于验证 OCSP 响应的信任证书链

    通常是你的 fullchain.pem 文件去掉服务器证书本身,只包含中级和根证书

    或者可以直接使用包含完整链的 fullchain.pem 文件 (Nginx 1.3.7+)

    Let’s Encrypt 通常使用 fullchain.pem 即可

    ssl_trusted_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;

    (可选)指定 DNS 解析服务器用于查询 OCSP responder

    resolver 8.8.8.8 8.8.4.4 valid=300s;

    resolver_timeout 5s;

    ``
    *
    ssl_trusted_certificate: 需要指向一个包含颁发你的证书的 CA 以及其上级 CA(直到根 CA)的证书链文件。对于 Let's Encrypt 的fullchain.pem`,它已经包含了服务器证书和中间证书,Nginx 可以从中提取所需的信任链。

  6. SSL 会话缓存与会话票证 (Session Cache & Session Tickets):

    • TLS 握手是计算密集型操作。为了提高性能,可以启用会话缓存或会话票证,允许客户端在一定时间内重用之前协商的安全参数,避免完整的握手过程。
      “`nginx

    SSL 会话缓存 (推荐)

    ‘shared:SSL:10m’ 表示创建一个名为 SSL 的共享内存区域,大小为 10MB (约 40000 个会话)

    ssl_session_cache shared:SSL:10m;

    会话超时时间 (默认 5 分钟)

    ssl_session_timeout 1d; # 例如设置为 1 天

    SSL 会话票证 (Session Tickets) – 可选,需谨慎

    启用 Session Tickets 可以进一步减少握手延迟,尤其对于移动客户端

    但如果服务器端的票证密钥 (ticket key) 管理不当,可能削弱 PFS 的安全性

    Nginx 1.5.9+ 默认启用。如果你的 OpenSSL 支持且安全策略允许,可以保持启用。

    ssl_session_tickets on; # 默认值,通常无需显式设置

    如果启用,强烈建议定期轮换 ticket key (Nginx 1.9.10+)

    ssl_session_ticket_key /path/to/your/session_ticket.key; # 需要生成和轮换密钥文件

    ``
    * **推荐优先使用
    ssl_session_cache。** 对于ssl_session_tickets`,需要了解其潜在的安全风险并做好密钥管理。

五、整合优化配置示例

将上述优化配置整合到一个单独的文件 snippets/ssl-params.conf 中:

“`nginx

/etc/nginx/snippets/ssl-params.conf

SSL/TLS 协议版本

ssl_protocols TLSv1.2 TLSv1.3;

加密套件 (示例,请使用 Mozilla SSL Config Generator 获取最新推荐)

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 on;

DH 参数 (如果使用 DHE 套件)

需要先生成: openssl dhparam -out /etc/nginx/dhparam.pem 2048

ssl_dhparam /etc/nginx/dhparam.pem;

OCSP Stapling

ssl_stapling on;
ssl_stapling_verify on;

ssl_trusted_certificate 指向包含信任链的文件 (通常是 fullchain.pem)

注意:这个指令需要放在 server 块内,因为它依赖于具体的证书

会话缓存

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;

(可选)会话票证 – 谨慎使用

ssl_session_tickets on;

(可选)HSTS 头 (强力推荐,但加入 preload 需谨慎)

注意:这个指令也最好放在 server 块内,以确保只对 HTTPS 连接添加

add_header Strict-Transport-Security “max-age=63072000; includeSubDomains; preload” always;

其他安全头部 (可选但推荐)

add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options nosniff always;
add_header Referrer-Policy “strict-origin-when-cross-origin” always;

add_header Content-Security-Policy “default-src ‘self’; script-src ‘self’ ‘unsafe-inline’; …” always; # CSP 配置比较复杂,根据应用定制

“`

然后在你的 HTTPS server 块中 include 这个文件,并将需要特定于 server 的指令(如 ssl_trusted_certificate, add_header)放在 server 块内:

“`nginx
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name your_domain.com www.your_domain.com;

ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;

# 包含共享的 SSL 参数
include snippets/ssl-params.conf;

# Server 特定的 SSL/TLS 设置
# OCSP Stapling 需要信任链文件
ssl_trusted_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;

# HSTS 头
add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;

# 其他 server 配置...
root /var/www/your_domain.com/html;
index index.html index.htm;

location / {
    try_files $uri $uri/ =404;
}

# ... 其他 location, 日志等 ...

}
“`

六、测试 HTTPS 配置

配置完成后,必须进行测试以确保一切正常且安全设置生效:

  1. 浏览器测试:

    • 使用不同的现代浏览器 (Chrome, Firefox, Safari, Edge) 访问你的 https://your_domain.com
    • 检查地址栏是否有挂锁图标,点击它可以查看证书详情(颁发者、有效期、域名是否匹配等)。
    • 确保没有弹出任何安全警告。
    • 使用开发者工具 (F12) 查看网络 (Network) 标签页,确认请求是通过 HTTPS 和 HTTP/2 (如果已启用) 发送的。检查响应头 (Response Headers) 是否包含你设置的 HSTS、X-Frame-Options 等安全头部。
  2. 在线 SSL 测试工具:

    • Qualys SSL Labs Server Test (https://www.ssllabs.com/ssltest/) 是最权威、最全面的测试工具。它会给你的 HTTPS 配置打分 (A+, A, B, C…),并详细报告协议支持、密钥交换、密码强度、证书链、常见漏洞防护 (如 POODLE, Heartbleed) 等情况。目标应该是获得 A 或 A+ 评级。
    • 其他工具如 ImmuniWeb SSLScan, Hardenize 等也可以提供有用的分析。
  3. 命令行测试 (OpenSSL):
    “`bash
    # 检查基本连接和证书信息
    openssl s_client -connect your_domain.com:443 -servername your_domain.com

    测试特定协议版本 (如 TLS 1.2)

    openssl s_client -connect your_domain.com:443 -servername your_domain.com -tls1_2

    测试 OCSP Stapling (查找 “OCSP Response Status: successful”)

    openssl s_client -connect your_domain.com:443 -servername your_domain.com -status < /dev/null 2>&1 | grep -i “OCSP Response Status”
    “`

七、证书续期

  • Let’s Encrypt: 如果你使用 Certbot 并选择了自动配置 Nginx (--nginx 插件),Certbot 通常会设置一个 systemd 定时器或 cron 任务来自动检查和续期证书。你可以通过以下命令测试自动续期过程(不会真的续期,除非证书即将过期):
    bash
    sudo certbot renew --dry-run

    可以通过 systemctl list-timers | grep certbotcat /etc/cron.d/certbot 查看定时任务。
  • 商业证书: 需要在证书到期前手动续期。通常 CA 会提前发送邮件提醒。续期过程可能需要重新生成 CSR、验证身份,然后下载新的证书文件,替换掉 Nginx 配置中旧的证书文件,并重载 Nginx。
  • 自签名证书: 手动重新运行 OpenSSL 命令生成新的证书和密钥,替换旧文件,然后重载 Nginx。

重要提示: 无论使用哪种证书,都要确保有监控机制,能在证书即将过期时收到通知,避免因证书过期导致网站无法访问。

八、常见问题与故障排查

  1. Nginx 无法启动/重载:
    • 运行 sudo nginx -t 查看详细错误信息。
    • 常见错误:配置文件语法错误、证书/密钥文件路径不正确、文件权限问题(Nginx 进程无权读取证书/密钥)、端口 443 被占用。
  2. 浏览器报告证书错误:
    • “证书无效/不受信任”:
      • 可能是自签名证书。
      • 证书链不完整:确保 ssl_certificate 文件包含了服务器证书和所有必要的中级证书。
      • 使用了过期的证书。
      • 客户端操作系统或浏览器过旧,不信任较新的根 CA。
    • “证书名称不匹配 (NET::ERR_CERT_COMMON_NAME_INVALID)”: 证书中的 Common Name (CN) 或 Subject Alternative Name (SAN) 与你访问的域名不符。确保证书涵盖了 your_domain.comwww.your_domain.com (如果两者都使用)。
  3. SSL Labs 评分低:
    • 检查报告中的具体问题:可能是不支持 TLS 1.2/1.3、启用了不安全的协议 (SSLv3, TLS1.0/1.1)、使用了弱加密套件、没有启用 PFS、缺少 HSTS 头、OCSP Stapling 未配置或失败等。根据报告的建议调整 Nginx 配置。
  4. 网站出现混合内容 (Mixed Content) 警告:
    • 这表示 HTTPS 页面加载了通过 HTTP 加载的资源 (如图片、脚本、样式表)。这会降低页面的安全性。
    • 解决方法:确保网站代码中所有资源都使用相对路径 (/images/logo.png) 或 HTTPS 绝对路径 (https://your_domain.com/js/script.js)。可以使用浏览器开发者工具的 Console 查找混合内容警告。可以考虑添加 Content-Security-Policy 响应头来阻止加载不安全的资源。
  5. OCSP Stapling 不工作:
    • 确保 ssl_stapling on;ssl_stapling_verify on; 已配置。
    • 确保证书链正确 (ssl_trusted_certificate)。
    • 确保 Nginx 服务器可以访问 CA 的 OCSP 服务器 (检查防火墙规则,可能需要配置 resolver)。
    • 首次启动或证书更新后,Nginx 需要时间去获取 OCSP 响应,可能需要几次请求后 Stapling 才会生效。

九、总结

为 Nginx 配置 HTTPS 是保障网站安全、提升用户信任度和满足现代 Web 标准的基础要求。其核心在于获取有效的 SSL/TLS 证书,并在 Nginx 配置文件中正确指定证书和私钥路径,监听 443 端口,并启用 ssl 参数。

然而,基础配置只是起点。为了达到更高的安全性和性能,务必进行深入优化:禁用不安全协议,选择强加密套件,启用 PFS,部署 HSTS,配置 OCSP Stapling,并管理好 SSL 会话。

配置完成后,使用 SSL Labs 等工具进行全面测试至关重要,目标是达到 A 或 A+ 评级。最后,不要忘记证书的及时续期,确保持续的安全防护。

掌握 Nginx 的 HTTPS 配置,不仅能保护你的用户数据,还能提升网站的专业形象和搜索引擎排名,是每一个网站管理员和开发人员必备的技能。随着技术的发展,持续关注 SSL/TLS 领域的最佳实践并更新你的配置同样重要。


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部