Nginx HTTPS 配置权威指南:从零开始构建安全的 Web 服务
在当今互联网环境中,数据安全和用户隐私变得前所未有的重要。HTTP 协议作为万维网的基础,其明文传输的特性使其极易受到窃听和篡改。为了解决这个问题,HTTPS(Hypertext Transfer Protocol Secure)应运而生。HTTPS 通过在 HTTP 和 TCP 之间加入一层 SSL/TLS 加密层,为网站通信提供了身份验证、数据加密和完整性保护。搜索引擎(如 Google)也将 HTTPS 作为排名因素之一,因此,为您的网站启用 HTTPS 不仅是安全需求,也是提升用户体验和 SEO 表现的关键举措。
Nginx 作为一款高性能、高并发、低资源消耗的 Web 服务器和反向代理软件,在全球范围内被广泛使用。在其上配置 HTTPS 是网站管理员必备的核心技能之一。本文将详细阐述在 Nginx 服务器上配置 HTTPS 的完整流程,涵盖从获取 SSL/TLS 证书到优化安全配置的各个环节,旨在为您提供一份全面、深入且实用的操作指南。
一、 HTTPS 与 SSL/TLS 基础
在深入配置步骤之前,有必要理解几个核心概念:
- HTTPS: 本质上是 HTTP over SSL/TLS。它利用 SSL/TLS 协议对 HTTP 传输的数据进行加密,确保数据在客户端和服务器之间传输时的机密性。
- SSL/TLS: 安全套接层(Secure Sockets Layer)及其后继者传输层安全(Transport Layer Security)是为网络通信提供安全及数据完整性保障的安全协议。TLS 是目前广泛使用的版本(TLS 1.2 和 TLS 1.3 是推荐版本)。
- SSL/TLS 证书: 这是一种数字证书,用于验证网站服务器的身份(身份验证)并启用加密连接。它包含服务器的公钥、服务器身份信息(如域名)以及颁发证书的证书颁发机构(CA)的数字签名。
- 证书颁发机构 (CA): 是负责颁发和管理数字证书的可信第三方实体。浏览器和操作系统内置了受信任的根 CA 列表。只有由受信任 CA 签发的证书才会被浏览器默认接受。
- 公钥/私钥对: SSL/TLS 使用非对称加密技术。服务器拥有一对密钥:公钥和私钥。公钥随证书一起分发给客户端,用于加密发送给服务器的数据;私钥由服务器严格保密,用于解密客户端发送的数据,并对服务器发送的数据进行签名。
二、 配置 HTTPS 的先决条件
在开始配置之前,请确保您满足以下条件:
- 拥有一个域名: HTTPS 证书是绑定到特定域名的。您需要拥有并控制您想要启用 HTTPS 的域名。
- 拥有服务器访问权限: 您需要能够通过 SSH 或其他方式访问您的服务器,并具有
sudo
或root
权限来安装软件和修改配置文件。 - 安装了 Nginx: 您的服务器上需要已经安装并运行了 Nginx。如果尚未安装,可以使用适合您操作系统的包管理器进行安装(例如,
sudo apt update && sudo apt install nginx
for Debian/Ubuntu,sudo yum update && sudo yum install nginx
for CentOS/RHEL)。 - 防火墙配置: 确保服务器的防火墙允许 HTTPS 流量。默认情况下,HTTPS 使用 TCP 端口 443。您需要配置防火墙规则以允许该端口的入站连接(例如,使用
ufw
可以执行sudo ufw allow 'Nginx Full'
或sudo ufw allow 443/tcp
;使用firewalld
可以执行sudo firewall-cmd --permanent --add-service=https && sudo firewall-cmd --reload
)。 - 域名解析: 确保您的域名已正确解析到您服务器的公网 IP 地址。
三、 获取 SSL/TLS 证书
获取 SSL/TLS 证书是配置 HTTPS 的核心步骤。主要有两种途径:
- 通过证书颁发机构 (CA) 购买: 您可以从 Comodo (Sectigo), DigiCert, GlobalSign 等商业 CA 购买证书。商业证书通常提供不同的验证级别(DV, OV, EV)、更长的有效期以及客户支持和保险。
- 使用 Let’s Encrypt 获取免费证书: Let’s Encrypt 是一个免费、自动化、开放的证书颁发机构,得到了业界广泛支持。它提供的证书是域名验证(DV)类型,有效期为 90 天,但可以通过自动化工具轻松续期。对于大多数网站而言,Let’s Encrypt 是一个极佳的选择。
本指南将重点介绍使用 Let’s Encrypt 和其推荐的客户端 Certbot 来获取和管理证书。
使用 Certbot 获取 Let’s Encrypt 证书
Certbot 是一个易于使用的自动化工具,可以简化在服务器上获取和部署 Let’s Encrypt 证书的过程。它可以自动完成域名验证、获取证书以及配置 Nginx(可选)。
1. 安装 Certbot 和 Nginx 插件
根据您的操作系统,安装 Certbot 及其 Nginx 插件。
- Debian/Ubuntu:
bash
sudo apt update
sudo apt install certbot python3-certbot-nginx -y - CentOS/RHEL (使用 EPEL):
bash
sudo yum install epel-release -y
sudo yum install certbot python3-certbot-nginx -y - 其他系统: 请参考 Certbot 官方文档 (https://certbot.eff.org/) 获取适合您系统的安装说明。
2. 准备 Nginx 配置
在运行 Certbot 之前,确保您的 Nginx 配置文件中已经有一个针对您域名的 server
块,并且 server_name
指令设置正确。Certbot 需要找到这个块来验证域名所有权并(可选地)自动配置 HTTPS。
一个基本的 HTTP server
块示例 (/etc/nginx/sites-available/your_domain
或 /etc/nginx/conf.d/your_domain.conf
):
“`nginx
server {
listen 80;
listen [::]:80;
server_name your_domain www.your_domain; # 替换为您的域名
root /var/www/your_domain/html; # 替换为您的网站根目录
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ =404;
}
# 其他配置...
}
“`
确保 Nginx 配置语法正确并重新加载 Nginx:
bash
sudo nginx -t
sudo systemctl reload nginx
3. 运行 Certbot 获取证书
现在,运行 Certbot 并指定 Nginx 插件 (--nginx
)。Certbot 会自动检测您 Nginx 配置中的 server_name
,并引导您完成证书申请过程。
bash
sudo certbot --nginx -d your_domain -d www.your_domain # 替换为您的域名
--nginx
: 使用 Nginx 插件。-d
: 指定需要获取证书的域名。您可以为多个域名或子域名添加多个-d
参数。
Certbot 会执行以下操作:
- 询问邮箱: 用于接收重要通知(如证书即将过期)。
- 同意服务条款: 阅读并同意 Let’s Encrypt 的服务条款。
- 选择是否分享邮箱: 决定是否愿意与 EFF 分享您的邮箱。
- 域名验证: Certbot 会临时修改您的 Nginx 配置,以响应 Let’s Encrypt CA 发出的验证请求(通常是通过 HTTP-01 挑战,即在您的网站上放置一个特定文件)。
- 获取证书: 验证成功后,Certbot 会从 Let’s Encrypt 获取证书文件。
- 自动配置 Nginx (可选): Certbot 会询问您是否希望它自动修改 Nginx 配置以启用 HTTPS,并设置 HTTP 到 HTTPS 的重定向。通常建议选择自动配置(选项 2),因为它会为您处理大部分繁琐的配置工作。
如果一切顺利,Certbot 会告知您证书已成功获取并部署,同时会显示证书文件的存储位置(通常在 /etc/letsencrypt/live/your_domain/
目录下)以及到期日期。
证书文件说明:
cert.pem
: 您的域名证书。chain.pem
: Let’s Encrypt 的中间证书链。fullchain.pem
:cert.pem
和chain.pem
的组合,这是 Nginx 配置中通常需要引用的文件。privkey.pem
: 您的证书私钥。此文件必须严格保密! Nginx 需要读取此文件,但权限应设为只有 root 用户和 Nginx 进程所属用户可读。
如果 Certbot 自动配置了 Nginx,您可以跳到第五步“测试 HTTPS 配置”。如果选择手动配置,或者想要深入了解配置细节,请继续阅读第四步。
备选验证方式:Webroot 插件
如果您不希望 Certbot 修改您的 Nginx 配置,或者您的 Nginx 配置比较复杂,可以使用 webroot
插件。这要求您的 Nginx 服务器正在运行,并且您知道网站文件的根目录。
bash
sudo certbot certonly --webroot -w /var/www/your_domain/html -d your_domain -d www.your_domain
certonly
: 表示只获取证书,不进行安装(即不修改 Nginx 配置)。--webroot
: 使用 webroot 验证方式。-w
: 指定域名的 Web 根目录。Certbot 会在该目录下创建.well-known/acme-challenge/
目录并放置验证文件。
使用 webroot
方式获取证书后,您需要手动编辑 Nginx 配置文件来启用 HTTPS。
四、 手动配置 Nginx 启用 HTTPS
如果您没有让 Certbot 自动配置 Nginx,或者想要自定义配置,需要手动修改 Nginx 的 server
块。
通常建议为 HTTP (端口 80) 和 HTTPS (端口 443) 分别设置 server
块。
1. 创建或修改 HTTPS server
块
编辑您的 Nginx 站点配置文件(例如 /etc/nginx/sites-available/your_domain
或 /etc/nginx/conf.d/your_domain.conf
)。在原有的 server
块(监听 80 端口)下方或旁边,添加一个新的 server
块来处理 HTTPS 请求。
“`nginx
server {
# — 核心 SSL/TLS 配置 —
listen 443 ssl http2; # 监听 443 端口,启用 SSL/TLS,并启用 HTTP/2
listen [::]:443 ssl http2; # 同时监听 IPv6 的 443 端口
server_name your_domain www.your_domain; # 确保与证书匹配的域名
# --- 证书文件路径 ---
# 使用 Certbot 获取的证书路径 (请替换 your_domain)
ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
# --- (可选但推荐)包含增强安全性的 SSL/TLS 参数 ---
# include /etc/letsencrypt/options-ssl-nginx.conf; # Certbot 通常会生成这个文件
# ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Certbot 通常会生成这个文件
# --- 网站根目录和索引文件 ---
root /var/www/your_domain/html; # 与 HTTP server 块保持一致
index index.html index.htm;
# --- 其他 Location 块和配置 ---
location / {
try_files $uri $uri/ =404;
# 其他特定于 location 的配置...
}
# --- 访问日志和错误日志 (可选,但推荐为 HTTPS 单独配置) ---
access_log /var/log/nginx/your_domain.access.log;
error_log /var/log/nginx/your_domain.error.log;
# --- 其他服务器级别的配置 ---
# 例如: add_header Strict-Transport-Security ... (后面会详细介绍)
}
“`
关键指令解释:
listen 443 ssl http2;
:443
: 指定监听 HTTPS 的标准端口。ssl
: 启用此server
块的 SSL/TLS 功能。在较新版本的 Nginx (1.15.0+) 中,ssl
指令已成为listen
指令的一个参数,不再需要单独的ssl on;
指令 (该指令已废弃)。http2
: 启用 HTTP/2 协议。HTTP/2 相比 HTTP/1.1 性能更好,需要 SSL/TLS 支持。强烈建议启用。
server_name
: 必须包含您证书所覆盖的所有域名。ssl_certificate
: 指定服务器证书文件的路径。通常使用fullchain.pem
,它包含了服务器证书和所有必需的中间证书链。ssl_certificate_key
: 指定服务器私钥文件的路径。
2. 配置 HTTP 到 HTTPS 的重定向
为了强制所有用户使用安全的 HTTPS 连接,您需要将所有 HTTP 请求重定向到 HTTPS。修改监听 80 端口的 server
块,移除所有处理实际内容的配置,只保留重定向逻辑。
“`nginx
server {
listen 80;
listen [::]:80;
server_name your_domain www.your_domain; # 确保与 HTTPS 块的 server_name 匹配
# --- 永久重定向到 HTTPS ---
# 方法一:推荐,简洁高效
return 301 https://$host$request_uri;
# 方法二:如果需要更复杂的逻辑(一般不需要)
# location / {
# return 301 https://$server_name$request_uri;
# }
# Certbot 可能会添加类似下面的 rewrite 规则,效果相同
# if ($scheme != "https") {
# return 301 https://$host$request_uri;
# }
}
“`
return 301 https://$host$request_uri;
: 这是最常用且推荐的方式。301
: 表示永久重定向,对 SEO 友好。https://
: 指定目标协议为 HTTPS。$host
: Nginx 变量,表示请求头中的 Host 字段(即用户访问的域名)。使用$host
比硬编码域名更灵活,特别是当server_name
包含多个域名时。$request_uri
: Nginx 变量,包含请求的 URI (路径和查询字符串)。这确保用户被重定向到他们原本想访问的相同页面。
3. 检查配置并重新加载 Nginx
在应用更改之前,务必检查 Nginx 配置文件的语法:
bash
sudo nginx -t
如果输出显示 syntax is ok
和 test is successful
,则可以安全地重新加载 Nginx 以应用新配置:
bash
sudo systemctl reload nginx
如果测试失败,Nginx 会指出错误所在的文件和行号,请根据提示修复错误后再试。
五、 增强 HTTPS 安全性与性能
仅仅启用 HTTPS 是不够的,还需要进行一些额外的配置来增强安全性和性能,争取在 SSL Labs 等测试工具中获得 A+ 评级。
1. 使用推荐的 SSL/TLS 协议和密码套件
禁用已知不安全的旧协议(如 SSLv3, TLSv1.0, TLSv1.1)和弱密码套件。推荐使用 TLS 1.2 和 TLS 1.3。
在 HTTPS server
块或 http
块(全局生效)中添加:
“`nginx
http {
# … 其他 http 配置 …
# 全局 SSL/TLS 参数 (如果只想对特定站点生效,则放在 server 块内)
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; # 推荐的强密码套件列表 (来自 Mozilla Intermediate)
ssl_prefer_server_ciphers off; # TLS 1.3 中客户端优先;对于 TLS 1.2,设为 on 让服务器选择
# ... 其他 http 配置 ...
}
server {
listen 443 ssl http2;
# … 其他 server 配置 …
# 如果不在 http 块设置,可以在 server 块内设置
# ssl_protocols TLSv1.2 TLSv1.3;
# ssl_ciphers '...';
# ssl_prefer_server_ciphers off;
# ... 其他 server 配置 ...
}
“`
ssl_protocols
: 指定允许使用的 SSL/TLS 协议版本。ssl_ciphers
: 定义服务器支持的密码套件列表及其优先级。上述列表是一个常用的、安全性较高的配置(基于 Mozilla Intermediate compatibility),优先使用支持前向保密 (Forward Secrecy) 的 ECDHE 和 DHE 算法。您可以根据需要调整,或参考 Mozilla SSL Configuration Generator (https://ssl-config.mozilla.org/) 生成。ssl_prefer_server_ciphers
: 在 TLS 1.2 及更早版本中,设置为on
表示服务器优先选择其密码套件列表中的第一个匹配项。在 TLS 1.3 中,此指令无效,由客户端选择。对于现代配置,通常建议off
(TLS 1.3 行为) 或on
(兼容旧版 TLS 1.2)。
Certbot 自动生成的 options-ssl-nginx.conf
文件通常包含了这些推荐设置。 如果您使用了 Certbot 并包含了该文件 (include /etc/letsencrypt/options-ssl-nginx.conf;
),则无需手动添加这些指令,除非您想覆盖某些特定设置。
2. 启用 Diffie-Hellman 参数 (DHE/EDH)
为了支持 DHE/EDH 密码套件并增强前向保密性,需要生成一个强的 Diffie-Hellman (DH) 参数文件。Certbot 通常会自动生成此文件(例如 /etc/letsencrypt/ssl-dhparams.pem
)。如果需要手动生成,可以使用 OpenSSL:
“`bash
生成 2048 位的 DH 参数文件 (推荐至少 2048 位)
sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
对于更高安全性,可以使用 4096 位,但这会增加握手时的 CPU 消耗
sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096
“`
然后在 Nginx 的 HTTPS server
块或 http
块中引用它:
nginx
ssl_dhparam /etc/nginx/ssl/dhparam.pem; # 或者 Certbot 生成的路径
3. 启用 HTTP Strict Transport Security (HSTS)
HSTS 是一种安全策略机制,它强制浏览器始终使用 HTTPS 访问您的网站,即使 S 输入了 http://
或点击了 HTTP 链接。这有助于防止协议降级攻击和 Cookie 劫持。
在 HTTPS server
块中添加 add_header
指令:
“`nginx
server {
listen 443 ssl http2;
# … 其他 SSL 配置 …
# 启用 HSTS (示例:有效期 6 个月)
# max-age 单位为秒 (6 个月 ≈ 15768000 秒)
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
# 如果您确信所有子域名都支持 HTTPS,并希望将域名提交到 HSTS 预加载列表
# add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# 注意:一旦启用 preload,撤销会很困难,请谨慎使用。
# ... 其他 server 配置 ...
}
“`
max-age
: 指定 HSTS 策略在浏览器中保持有效的时间(秒)。建议设置较长的时间(如 6 个月或 1 年)。includeSubDomains
: 可选参数,表示此策略也适用于所有子域名。仅当您确信所有子域名都支持 HTTPS 时才添加此参数。preload
: 可选参数,表示您希望将您的域名加入到主流浏览器的 HSTS 预加载列表中。这是一个更强的保护,但需要先确保网站完全支持 HTTPS 且 HSTS 配置正确稳定,然后通过 https://hstspreload.org/ 提交申请。启用preload
是一个长期承诺,撤销过程复杂,请务必谨慎。always
: Nginx 1.7.5+ 版本中推荐添加此参数,确保 HSTS 头在所有响应(包括错误页面)中都被发送。
重要提示: 在启用 HSTS,特别是 includeSubDomains
或 preload
之前,请务必确保您的网站及其所有子域名(如果适用)完全支持 HTTPS 并且运行稳定。否则,用户可能无法访问您的网站的某些部分。建议先设置一个较短的 max-age
(例如 5 分钟:max-age=300
) 进行测试,确认无误后再逐步增加 max-age
。
4. 启用 OCSP Stapling
在线证书状态协议 (Online Certificate Status Protocol, OCSP) 用于检查 SSL/TLS 证书是否已被吊销。OCSP Stapling 是一种性能优化,允许服务器定期从 CA 获取其证书的 OCSP 响应,并在 TLS 握手期间将其“钉”在响应中发送给客户端。这避免了客户端自己去查询 CA,减少了延迟并提高了隐私性。
在 HTTPS server
块或 http
块中添加:
“`nginx
http {
# …
# 需要一个 DNS 解析器来查询 OCSP 服务器
resolver 8.8.8.8 8.8.4.4 valid=300s; # 使用 Google Public DNS,可替换为您的本地解析器或 ISP 的 DNS
resolver_timeout 5s;
# …
}
server {
listen 443 ssl http2;
# … ssl_certificate, ssl_certificate_key …
# 启用 OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
# 指定包含 CA 根证书和中间证书的信任链文件
# 通常,fullchain.pem 包含了服务器证书和中间证书,但 OCSP 验证需要信任链中的根证书。
# Certbot 通常会处理好这个,但有时需要明确指定包含根 CA 的文件。
# 如果使用 Let's Encrypt,可以尝试指向其根证书或信任链文件。
# Let's Encrypt 的 ISRG Root X1 和中间证书通常已在 `chain.pem` 或 `fullchain.pem` 中,
# 但有时 Nginx 需要一个只包含受信任 CA 证书的文件来进行 OCSP 响应验证。
# 可以尝试指向 CA 提供的信任链文件,或系统的 CA 证书包。
# 例如: ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt; (Debian/Ubuntu)
# 或者指向 Let's Encrypt 的 chain.pem:
ssl_trusted_certificate /etc/letsencrypt/live/your_domain/chain.pem;
# ... 其他 server 配置 ...
}
“`
resolver
: 指定 Nginx 用于查询 OCSP 服务器的 DNS 解析器地址。ssl_stapling on
: 启用 OCSP Stapling。ssl_stapling_verify on
: 启用对服务器获取到的 OCSP 响应的验证。ssl_trusted_certificate
: 指定一个包含受信任 CA 证书的文件,Nginx 用它来验证 OCSP 响应的签名。通常指向包含 Let’s Encrypt 中间证书的文件 (chain.pem
) 或系统范围的 CA 证书包即可。
配置完成后,别忘了测试 Nginx 配置并重新加载。
5. (可选) 优化 SSL/TLS 会话
为了减少重复访问时 TLS 握手的开销,可以启用 SSL/TLS 会话缓存或会话票证 (Session Tickets)。
“`nginx
http {
# …
# SSL 会话缓存 (推荐)
ssl_session_cache shared:SSL:10m; # 设置一个 10MB 的共享缓存,可存储约 40000 个会话
ssl_session_timeout 1d; # 会话可以在缓存中保留 1 天
# SSL 会话票证 (Session Tickets) - 注意潜在的安全风险 (PFS 可能被削弱)
# 启用 Session Tickets 可以进一步减少握手延迟,但如果密钥轮换不当,可能影响前向保密性
# ssl_session_tickets on; # Nginx 1.5.9+ 默认开启
# 如果启用,需要定期轮换 session ticket key:
# ssl_session_ticket_key /path/to/your/session_ticket.key;
# (需要手动生成和管理密钥文件)
# 鉴于复杂性和潜在风险,对于大多数场景,仅使用会话缓存可能更简单安全。
# ...
}
“`
ssl_session_cache
: 配置会话缓存。shared:SSL:10m
表示创建一个名为SSL
的 10MB 共享内存区域来存储会话信息。ssl_session_timeout
: 设置会话在缓存中的有效时间。ssl_session_tickets
: 控制是否启用会话票证。如果启用,建议仔细阅读 Nginx 文档关于密钥管理的部分。
六、 测试 HTTPS 配置
完成所有配置并重新加载 Nginx 后,需要进行全面测试:
-
浏览器测试: 在浏览器中输入
https://your_domain
访问您的网站。- 检查地址栏是否有挂锁图标,表示连接是安全的。
- 点击挂锁图标,查看证书信息,确认颁发者、有效期和域名是否正确。
- 尝试访问
http://your_domain
,确认是否自动重定向到 HTTPS。 - 浏览网站的不同页面,确保所有资源(图片、CSS、JS)都通过 HTTPS 加载(避免混合内容警告)。使用浏览器开发者工具 (F12) 的“网络” (Network) 和“控制台” (Console) 面板检查。
-
在线 SSL 测试工具: 使用专业的在线工具对您的 HTTPS 配置进行全面评估。最著名的是 Qualys SSL Labs 的 SSL Server Test:
- 访问 https://www.ssllabs.com/ssltest/
- 输入您的域名并开始测试。
- 测试需要几分钟时间。完成后,它会给出一个从 A+ 到 F 的评级,并提供详细的报告,包括协议支持、密码套件、证书详情、HSTS、OCSP Stapling 等各项检查结果。
- 目标是获得 A 或 A+ 评级。仔细阅读报告中的警告和建议,根据需要调整 Nginx 配置。
七、 自动续期 Let’s Encrypt 证书
Let’s Encrypt 证书有效期为 90 天,因此必须在到期前进行续期。幸运的是,Certbot 包通常会自动设置一个定时任务(通过 cron
或 systemd timer
)来定期检查并续期即将到期的证书。
1. 测试自动续期
您可以模拟续期过程来测试自动续期设置是否正常工作(这不会真的续期证书,除非证书接近到期):
bash
sudo certbot renew --dry-run
如果命令成功执行并没有报错,说明自动续期机制很可能工作正常。
2. 理解续期机制
- Certbot 的续期任务通常每天运行两次。
- 它会检查系统中所有由 Certbot 管理的证书。
- 只有当证书剩余有效期少于 30 天时,Certbot 才会尝试进行续期。
- 续期成功后,Certbot 会自动执行一个 “deploy hook” 来重新加载 Web 服务器(如 Nginx),以使新证书生效。
certbot --nginx
插件会自动配置好这个钩子。
3. 确保证书和配置持久化
确保证书文件(位于 /etc/letsencrypt/
)和 Nginx 配置文件在服务器重启后依然存在且配置正确。
八、 故障排除常见问题
- 无法访问 HTTPS 站点 (连接超时):
- 检查防火墙是否允许 443 端口的 TCP 连接。
- 确认 Nginx 是否正在监听 443 端口 (
sudo ss -tulpn | grep 443
)。 - 检查 Nginx 错误日志 (
/var/log/nginx/error.log
) 获取详细信息。
- 浏览器显示证书错误 (NET::ERR_CERT_*):
- 域名不匹配: 证书中的域名与您访问的地址不符。检查
server_name
和 Certbot 获取证书时使用的-d
参数。 - 证书过期: 检查证书有效期,确保证书已续期且 Nginx 已重新加载。
- 证书链不完整: Nginx 配置中
ssl_certificate
应指向fullchain.pem
而不是cert.pem
。 - 使用了自签名证书 (或不受信任的 CA): 浏览器不信任该证书。确保使用的是由受信任 CA(如 Let’s Encrypt)颁发的证书。
- 域名不匹配: 证书中的域名与您访问的地址不符。检查
- Nginx 无法启动或重新加载:
- 运行
sudo nginx -t
检查配置文件语法错误。Nginx 会指出错误的文件和行号。 - 常见错误包括:指令拼写错误、缺少分号、文件路径错误、权限问题(Nginx 无法读取证书或私钥文件)。确保证书文件路径正确,且 Nginx 进程(通常是
nginx
或www-data
用户)有读取fullchain.pem
和privkey.pem
的权限 (私钥文件权限应更严格,如 600,属主为 root)。
- 运行
- 混合内容 (Mixed Content) 警告:
- 您的 HTTPS 页面加载了通过 HTTP 引入的资源(如图片、脚本、样式表)。需要修改网站代码,将所有资源链接改为 HTTPS 或使用相对协议链接 (
//example.com/image.jpg
)。
- 您的 HTTPS 页面加载了通过 HTTP 引入的资源(如图片、脚本、样式表)。需要修改网站代码,将所有资源链接改为 HTTPS 或使用相对协议链接 (
- SSL Labs 评级不高:
- 仔细阅读 SSL Labs 报告中的细节。常见原因包括:启用了不安全的协议 (TLS 1.0/1.1)、使用了弱密码套件、缺少 HSTS 头、未启用 OCSP Stapling、DH 参数强度不足等。按照第五部分的建议进行优化。
九、 总结与后续维护
配置 Nginx 支持 HTTPS 是现代 Web 服务的基本要求。通过遵循本文的步骤,使用 Let’s Encrypt 和 Certbot,您可以相对轻松地为您的 Nginx 站点启用强大且免费的 SSL/TLS 加密。关键步骤包括获取证书、配置 Nginx 的 HTTPS server
块、设置 HTTP 到 HTTPS 的重定向、增强安全配置(协议、密码套件、HSTS、OCSP Stapling),以及确保证书自动续期。
启用 HTTPS 只是第一步。持续的安全维护同样重要:
- 定期更新系统和 Nginx: 及时应用安全补丁。
- 监控证书状态: 虽然 Certbot 会自动续期,但偶尔关注一下续期日志或设置监控总没有坏处。
- 关注安全动态: 了解最新的 SSL/TLS 漏洞和最佳实践,适时调整您的配置。
- 定期使用 SSL Labs 测试: 确保持续保持高安全评级。
通过实施健壮的 HTTPS 配置并持续维护,您可以显著提升网站的安全性、用户信任度以及搜索引擎排名,为您的在线业务保驾护航。