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 的基本工作原理。
-
HTTPS 的作用:
- 数据加密: 防止传输过程中的数据被窃听。即使数据包被截获,没有密钥也无法解密内容。
- 身份认证: 验证服务器的真实身份,防止用户访问到仿冒的“钓鱼”网站。这通常通过受信任的证书颁发机构 (CA, Certificate Authority) 签发的 SSL/TLS 证书来实现。
- 数据完整性: 确保数据在传输过程中没有被篡改。通过消息认证码 (MAC) 等机制进行校验。
-
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 保证完整性。
-
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 证书。主要有以下几种途径:
-
向商业 CA 购买:
- 优点:提供多种证书类型 (DV, OV, EV),通常有较好的技术支持和赔付保证。
- 缺点:需要付费,价格从几十美元到几百甚至上千美元不等。
- 流程:选择 CA -> 生成 CSR (Certificate Signing Request) -> 提交 CSR 和验证信息 -> CA 审核并签发证书 -> 下载证书文件。
-
使用 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
(私钥)。
-
使用自签名证书:
- 优点:完全免费,生成简单快速,适用于内部测试、开发环境。
- 缺点:不被浏览器和操作系统信任,访问时会弹出安全警告,绝对不适用于公共网站。
- 生成方法 (使用 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.pem
和 privkey.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.pem
或chained.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
指令引入。
-
选择安全的 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 有更强的安全性和更好的性能(握手更快)。
- 禁用已知不安全的协议版本 (SSLv3, TLSv1.0, TLSv1.1)。推荐只启用 TLS 1.2 和 TLS 1.3。
-
配置安全的加密套件 (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 生成器是更可靠的方式。
* **注意:** 上述 -
启用 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-
开头的)。
-
启用 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)也会发送此头部。
* - HSTS 是一个安全策略机制,通过一个 HTTP 响应头 (
-
启用 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 可以从中提取所需的信任链。 -
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`,需要了解其潜在的安全风险并做好密钥管理。 - TLS 握手是计算密集型操作。为了提高性能,可以启用会话缓存或会话票证,允许客户端在一定时间内重用之前协商的安全参数,避免完整的握手过程。
五、整合优化配置示例
将上述优化配置整合到一个单独的文件 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 配置
配置完成后,必须进行测试以确保一切正常且安全设置生效:
-
浏览器测试:
- 使用不同的现代浏览器 (Chrome, Firefox, Safari, Edge) 访问你的
https://your_domain.com
。 - 检查地址栏是否有挂锁图标,点击它可以查看证书详情(颁发者、有效期、域名是否匹配等)。
- 确保没有弹出任何安全警告。
- 使用开发者工具 (F12) 查看网络 (Network) 标签页,确认请求是通过 HTTPS 和 HTTP/2 (如果已启用) 发送的。检查响应头 (Response Headers) 是否包含你设置的 HSTS、X-Frame-Options 等安全头部。
- 使用不同的现代浏览器 (Chrome, Firefox, Safari, Edge) 访问你的
-
在线 SSL 测试工具:
- Qualys SSL Labs Server Test (https://www.ssllabs.com/ssltest/) 是最权威、最全面的测试工具。它会给你的 HTTPS 配置打分 (A+, A, B, C…),并详细报告协议支持、密钥交换、密码强度、证书链、常见漏洞防护 (如 POODLE, Heartbleed) 等情况。目标应该是获得 A 或 A+ 评级。
- 其他工具如 ImmuniWeb SSLScan, Hardenize 等也可以提供有用的分析。
-
命令行测试 (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 certbot
或cat /etc/cron.d/certbot
查看定时任务。 - 商业证书: 需要在证书到期前手动续期。通常 CA 会提前发送邮件提醒。续期过程可能需要重新生成 CSR、验证身份,然后下载新的证书文件,替换掉 Nginx 配置中旧的证书文件,并重载 Nginx。
- 自签名证书: 手动重新运行 OpenSSL 命令生成新的证书和密钥,替换旧文件,然后重载 Nginx。
重要提示: 无论使用哪种证书,都要确保有监控机制,能在证书即将过期时收到通知,避免因证书过期导致网站无法访问。
八、常见问题与故障排查
- Nginx 无法启动/重载:
- 运行
sudo nginx -t
查看详细错误信息。 - 常见错误:配置文件语法错误、证书/密钥文件路径不正确、文件权限问题(Nginx 进程无权读取证书/密钥)、端口 443 被占用。
- 运行
- 浏览器报告证书错误:
- “证书无效/不受信任”:
- 可能是自签名证书。
- 证书链不完整:确保
ssl_certificate
文件包含了服务器证书和所有必要的中级证书。 - 使用了过期的证书。
- 客户端操作系统或浏览器过旧,不信任较新的根 CA。
- “证书名称不匹配 (NET::ERR_CERT_COMMON_NAME_INVALID)”: 证书中的 Common Name (CN) 或 Subject Alternative Name (SAN) 与你访问的域名不符。确保证书涵盖了
your_domain.com
和www.your_domain.com
(如果两者都使用)。
- “证书无效/不受信任”:
- SSL Labs 评分低:
- 检查报告中的具体问题:可能是不支持 TLS 1.2/1.3、启用了不安全的协议 (SSLv3, TLS1.0/1.1)、使用了弱加密套件、没有启用 PFS、缺少 HSTS 头、OCSP Stapling 未配置或失败等。根据报告的建议调整 Nginx 配置。
- 网站出现混合内容 (Mixed Content) 警告:
- 这表示 HTTPS 页面加载了通过 HTTP 加载的资源 (如图片、脚本、样式表)。这会降低页面的安全性。
- 解决方法:确保网站代码中所有资源都使用相对路径 (
/images/logo.png
) 或 HTTPS 绝对路径 (https://your_domain.com/js/script.js
)。可以使用浏览器开发者工具的 Console 查找混合内容警告。可以考虑添加Content-Security-Policy
响应头来阻止加载不安全的资源。
- 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 领域的最佳实践并更新你的配置同样重要。