15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
30.10.2024

如何在 Nginx 中设置 SSL 证书:完整的分步指南

使用 SSL/TLS 证书保护您的网站已不再是可选项——它是建立用户信任、保护数据安全和提升搜索引擎排名的基本要求。自 2014 年起,Google 已明确将 HTTPS 作为排名信号,现代浏览器也会主动警告访问者当网站缺乏加密时。如果您正在使用 Nginx 作为 Web 服务器,本指南将带您了解使用 Certbot 和 Let’s Encrypt 安装、配置和自动化 SSL 证书管理所需的一切知识。

无论您是在管理 VPS 托管环境、独立服务器还是共享托管计划,正确配置 SSL 对任何生产网站来说都是不可或缺的。

什么是 SSL 证书,为什么 Nginx 需要它?

SSL(安全套接层)证书——如今更准确地称为 TLS(传输层安全)证书——在您的 Web 服务器与访问者浏览器之间建立加密连接。这种加密确保登录凭据、支付信息和个人详情等敏感数据不会被恶意第三方拦截。

对于 Nginx 而言,SSL 配置涉及:

  • 证书文件:由证书颁发机构(CA)颁发的公共证书链
  • 私钥:安全存储在服务器上的加密生成密钥
  • 服务器块指令:将证书绑定到您域名的 Nginx 配置指令

没有 SSL,您的网站通过 HTTP 提供服务,这意味着所有流量以明文传输。正确配置 SSL 后,您的网站使用 HTTPS——加密、经过身份验证,并受到浏览器和搜索引擎的信任。

> 专业提示:如果您正在评估托管选项,AlexHost 为各类域名提供 SSL 证书,包括域名验证(DV)、组织验证(OV)和扩展验证(EV)证书。

开始之前的准备条件

在深入配置步骤之前,请确保满足以下条件:

  • 运行中的 Nginx Web 服务器,基于 Linux 系统(推荐 Ubuntu 20.04/22.04 或 Debian)
  • 服务器的 root 或 sudo 访问权限
  • 已注册的域名,通过 DNS A 记录指向您服务器的 IP 地址——您可以通过域名注册注册一个
  • 开放的防火墙端口:TCP 端口 80(HTTP)和 443(HTTPS)必须可访问
  • 具有 sudo 权限的非 root 用户(服务器安全的最佳实践)

您可以通过以下命令验证 Nginx 是否正在运行:

sudo systemctl status nginx

并使用以下命令确认您的域名解析正确:

dig yourdomain.com +short

第 1 步:在服务器上安装 Certbot

Certbot 是 Let’s Encrypt 的官方开源客户端——一个免费、自动化且广受信任的证书颁发机构。它处理整个证书颁发流程,包括域名验证和 Nginx 配置更新。

更新软件包索引

始终从刷新软件包列表开始,以确保您安装的是最新可用版本:

sudo apt update && sudo apt upgrade -y

安装 Certbot 和 Nginx 插件

python3-certbot-nginx 插件允许 Certbot 直接读取和修改您的 Nginx 配置文件,自动化大部分设置过程:

sudo apt install certbot python3-certbot-nginx -y

验证安装

通过检查版本确认 Certbot 安装成功:

certbot --version

您应该看到类似 certbot 2.x.x 的输出。

第 2 步:允许 HTTPS 流量通过防火墙

如果您使用 UFW(简单防火墙),在继续之前需要明确允许 HTTPS 流量:

sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'
sudo ufw status

Nginx Full 配置文件允许 HTTP(端口 80)和 HTTPS(端口 443)。删除独立的 HTTP 规则可确保配置 SSL 后,不会留下不必要的开放端口。

第 3 步:从 Let’s Encrypt 获取 SSL 证书

安装 Certbot 并配置防火墙后,您现在可以请求证书。--nginx 标志告诉 Certbot 使用 Nginx 插件,该插件自动处理 ACME 质询验证并更新您的服务器配置。

sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

此过程中发生了什么?

  1. 域名所有权验证:Certbot 临时修改您的 Nginx 配置以提供质询文件,向 Let’s Encrypt 证明您控制该域名
  2. 证书颁发:Let’s Encrypt 颁发有效期为 90 天的签名证书
  3. 自动 Nginx 配置:Certbot 更新您的 Nginx 服务器块以使用新的证书文件

交互式提示

在此过程中,Certbot 将询问:

  • 电子邮件地址,用于紧急续期和安全通知
  • 同意服务条款
  • 是否将 HTTP 重定向到 HTTPS——始终选择选项 2(重定向)以在全站强制执行 HTTPS

您的证书将存储在:

/etc/letsencrypt/live/yourdomain.com/

关键文件为:

文件用途
fullchain.pem您的证书 + 中间链
privkey.pem您的私钥(请保密)
cert.pem仅您的域名证书
chain.pem仅中间证书

第 4 步:手动配置 Nginx 的 SSL(高级)

虽然 Certbot 自动化了大部分配置,但了解手动设置可让您完全控制 SSL 实现——这对于性能调优、安全加固和自定义部署至关重要。

打开 Nginx 服务器块配置

sudo nano /etc/nginx/sites-available/yourdomain.com

如果您使用默认配置文件:

sudo nano /etc/nginx/sites-available/default

完整的 SSL 服务器块配置

用以下加固示例替换或更新您的配置:

# Redirect all HTTP traffic to HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name yourdomain.com www.yourdomain.com;
    return 301 https://$host$request_uri;
}

# HTTPS server block
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name yourdomain.com www.yourdomain.com;

    # SSL Certificate Paths
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

    # Recommended SSL parameters
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/yourdomain.com/chain.pem;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    # Security Headers
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header Referrer-Policy "no-referrer-when-downgrade";

    # Document root and index
    root /var/www/yourdomain.com/html;
    index index.html index.htm index.nginx-debian.html;

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

关键配置指令说明

  • ssl_protocols TLSv1.2 TLSv1.3:禁用较旧的易受攻击协议(SSLv3、TLS 1.0、TLS 1.1)
  • ssl_ciphers:指定优先考虑前向保密的强密码套件
  • ssl_stapling on:启用 OCSP 装订,减少 SSL 握手延迟
  • Strict-Transport-Security:指示浏览器始终对您的域名使用 HTTPS(HSTS)
  • http2:启用 HTTP/2 以提升 HTTPS 连接性能

第 5 步:测试您的 Nginx 配置

在重启 Nginx 之前,始终验证您的配置语法以捕获可能导致网站下线的错误:

sudo nginx -t

成功的测试返回:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

如果遇到错误,请仔细查看输出——Nginx 将指出问题所在的文件和行号。

第 6 步:重启 Nginx 以应用更改

配置测试通过后,重新加载或重启 Nginx:

# Graceful reload (preferred for production — no downtime)
sudo systemctl reload nginx

# Full restart (use if reload doesn't apply all changes)
sudo systemctl restart nginx

重启后验证 Nginx 是否正常运行:

sudo systemctl status nginx

第 7 步:设置 SSL 证书自动续期

Let’s Encrypt 证书在 90 天后过期。这个较短的有效期是有意为之的——它限制了证书泄露造成的损害并鼓励自动化。Certbot 会自动安装 systemd 计时器(或 cron 任务)来处理续期,但您应该验证并测试它。

检查现有续期计时器

sudo systemctl status certbot.timer

您应该看到计时器处于活动状态并计划每天运行两次。

测试续期流程

模拟续期而不实际修改任何证书:

sudo certbot renew --dry-run

成功的输出将包括:

Congratulations, all simulated renewals succeeded:
  /etc/letsencrypt/live/yourdomain.com/fullchain.pem (success)

添加续期后钩子以重新加载 Nginx

除非您配置部署钩子,否则 Certbot 在续期证书后不会自动重新加载 Nginx。使用以下命令创建一个:

sudo nano /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh

添加以下内容:

#!/bin/bash
systemctl reload nginx

使其可执行:

sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh

这确保 Nginx 在每次成功续期后立即加载新的证书文件。

第 8 步:验证您的 SSL 安装

完成设置后,使用以下方法验证您的 SSL 配置:

浏览器检查

在浏览器中导航到 https://yourdomain.com。您应该在地址栏中看到一个挂锁图标,表示连接安全。

在线 SSL 测试工具

使用这些免费工具审核您的 SSL 配置质量:

  • SSL Labs(Qualys)https://www.ssllabs.com/ssltest/——提供字母评级(目标为 A 或 A+)
  • Security Headershttps://securityheaders.com/——审核您的 HTTP 安全标头
  • HSTS Preloadhttps://hstspreload.org/——检查 HSTS 预加载资格

命令行验证

# Check certificate details
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com

# Check certificate expiry date
echo | openssl s_client -connect yourdomain.com:443 2>/dev/null | openssl x509 -noout -dates

Nginx 中常见 SSL 问题排查

问题可能原因解决方案
ERR_SSL_PROTOCOL_ERRORNginx 未监听端口 443检查 listen 443 ssl; 指令和防火墙规则
NET::ERR_CERT_AUTHORITY_INVALID使用 cert.pem 而非 fullchain.pemssl_certificate 更新为使用 fullchain.pem
证书未续期Certbot 计时器已禁用或端口 80 被阻止运行 sudo certbot renew --dry-run 并检查日志
混合内容警告HTTPS 页面加载了 HTTP 资源将所有内部链接和资源 URL 更新为 HTTPS
SSL_ERROR_RX_RECORD_TOO_LONGHTTP 流量访问了 HTTPS 端口确保已配置从端口 80 到 443 的重定向

为 SSL 选择合适的托管环境

您的 SSL 实现的性能和可靠性在很大程度上取决于您的托管环境。以下是简要概述:

  • VPS 托管:完整的 root 访问权限让您完全控制 Nginx 配置、SSL 参数和证书管理——非常适合本指南
  • 独立服务器:为需要企业级 SSL 配置的高流量网站提供最大性能和隔离
  • 共享虚拟主机:SSL 通常通过控制面板管理;Certbot 手动配置可能不可用
  • 带 cPanel 的 VPS:通过图形界面简化 SSL 管理,同时保留 VPS 级别的控制

对于需要完全控制其 SSL 堆栈的开发人员和系统管理员,VPS 或独立服务器是推荐的选择。

结论

在 Nginx 中设置 SSL 是一个多步骤过程,但每个步骤都有其关键目的——从加密流量和验证域名所有权,到加固密码配置和自动化续期。通过遵循本指南,您已实现:

✅ 通过 Let’s Encrypt 和 Certbot 获得免费、受信任的 SSL 证书

✅ 采用现代 TLS 协议的加固 Nginx SSL 配置

✅ 所有流量的 HTTP 到 HTTPS 重定向

✅ 用于改善握手性能的 OCSP 装订

✅ 用于深度防御的 HSTS 和安全标头

✅ 带有 Nginx 重新加载钩子的自动化证书续期

正确配置的 SSL 证书不仅能保护您的用户——它还能建立信任、提升您的 SEO 排名,并且是任何专业 Web 存在的基本要求。如果您正在寻找可靠的基础设施来托管您的 SSL 安全 Nginx 服务器,请探索 AlexHost 的 VPS 托管计划,专为重视安全的开发人员和企业打造。

15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用