如何在 Nginx 上配置 HTTPS (详细步骤) – wiki基地


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 基础

在深入配置步骤之前,有必要理解几个核心概念:

  1. HTTPS: 本质上是 HTTP over SSL/TLS。它利用 SSL/TLS 协议对 HTTP 传输的数据进行加密,确保数据在客户端和服务器之间传输时的机密性。
  2. SSL/TLS: 安全套接层(Secure Sockets Layer)及其后继者传输层安全(Transport Layer Security)是为网络通信提供安全及数据完整性保障的安全协议。TLS 是目前广泛使用的版本(TLS 1.2 和 TLS 1.3 是推荐版本)。
  3. SSL/TLS 证书: 这是一种数字证书,用于验证网站服务器的身份(身份验证)并启用加密连接。它包含服务器的公钥、服务器身份信息(如域名)以及颁发证书的证书颁发机构(CA)的数字签名。
  4. 证书颁发机构 (CA): 是负责颁发和管理数字证书的可信第三方实体。浏览器和操作系统内置了受信任的根 CA 列表。只有由受信任 CA 签发的证书才会被浏览器默认接受。
  5. 公钥/私钥对: SSL/TLS 使用非对称加密技术。服务器拥有一对密钥:公钥和私钥。公钥随证书一起分发给客户端,用于加密发送给服务器的数据;私钥由服务器严格保密,用于解密客户端发送的数据,并对服务器发送的数据进行签名。

二、 配置 HTTPS 的先决条件

在开始配置之前,请确保您满足以下条件:

  1. 拥有一个域名: HTTPS 证书是绑定到特定域名的。您需要拥有并控制您想要启用 HTTPS 的域名。
  2. 拥有服务器访问权限: 您需要能够通过 SSH 或其他方式访问您的服务器,并具有 sudoroot 权限来安装软件和修改配置文件。
  3. 安装了 Nginx: 您的服务器上需要已经安装并运行了 Nginx。如果尚未安装,可以使用适合您操作系统的包管理器进行安装(例如,sudo apt update && sudo apt install nginx for Debian/Ubuntu, sudo yum update && sudo yum install nginx for CentOS/RHEL)。
  4. 防火墙配置: 确保服务器的防火墙允许 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)。
  5. 域名解析: 确保您的域名已正确解析到您服务器的公网 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.pemchain.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 oktest 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,特别是 includeSubDomainspreload 之前,请务必确保您的网站及其所有子域名(如果适用)完全支持 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 后,需要进行全面测试:

  1. 浏览器测试: 在浏览器中输入 https://your_domain 访问您的网站。

    • 检查地址栏是否有挂锁图标,表示连接是安全的。
    • 点击挂锁图标,查看证书信息,确认颁发者、有效期和域名是否正确。
    • 尝试访问 http://your_domain,确认是否自动重定向到 HTTPS。
    • 浏览网站的不同页面,确保所有资源(图片、CSS、JS)都通过 HTTPS 加载(避免混合内容警告)。使用浏览器开发者工具 (F12) 的“网络” (Network) 和“控制台” (Console) 面板检查。
  2. 在线 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 包通常会自动设置一个定时任务(通过 cronsystemd 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 进程(通常是 nginxwww-data 用户)有读取 fullchain.pemprivkey.pem 的权限 (私钥文件权限应更严格,如 600,属主为 root)。
  • 混合内容 (Mixed Content) 警告:
    • 您的 HTTPS 页面加载了通过 HTTP 引入的资源(如图片、脚本、样式表)。需要修改网站代码,将所有资源链接改为 HTTPS 或使用相对协议链接 (//example.com/image.jpg)。
  • 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 配置并持续维护,您可以显著提升网站的安全性、用户信任度以及搜索引擎排名,为您的在线业务保驾护航。


发表评论

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

滚动至顶部