bg-tutorials

如何在NGINX上安装SSL证书

本指南将向您展示如何在 NGINX 上安装 SSL/TLS 证书。内容涵盖了大多数人容易出错的部分:构建 NGINX 所需的正确证书链(”fullchain”)、将正确的指令指向正确的文件、在重新加载之前测试配置,以及添加一个干净的 HTTP 到 HTTPS 重定向,确保每位访客都能进入您网站的安全版本。

为 NGINX 生成 CSR 代码

如果您已经生成了 CSR 并手头持有已签发的证书文件,可以直接跳到在 NGINX 上安装 SSL 证书部分。

在证书颁发机构签发证书之前,您需要提交一份 CSR(证书签名请求):一段包含您域名信息和公钥的小型文本块,与保存在服务器上的私钥配对。您有两种选择:

  • 使用我们的CSR 生成器自动生成 CSR。该工具会同时返回 CSR 和匹配的私钥,随后您可将其上传到服务器。
  • 按照我们的教程如何在 NGINX 上生成 CSR,使用 OpenSSL 在服务器本身上生成 CSR。私钥将保留在服务器上。

用任意文本编辑器打开生成的 .csr 文件;其中的文本块(包括 —–BEGIN CERTIFICATE REQUEST—–—–END CERTIFICATE REQUEST—– 这两行)就是您在结账时粘贴到 SSL 申请表单中的内容。如果想在提交前确认 CSR 的内容,可以将其粘贴到我们的CSR 解码器中。

在 NGINX 上安装 SSL 证书

一旦 CA 签发了证书,您通常会收到以下内容:

  • 您的主(服务器)证书,通常是以您的域名命名的 .crt 文件。
  • 中间证书(有时还包括根证书),可能是单独的 .crt 文件,也可能打包在一个 .ca-bundle 文件中。
  • 与您的 CSR 一起生成的私钥(一个 .key 文件)。

NGINX 需要将服务器证书和中间证书链合并为一个文件(即 “fullchain”),并通过 ssl_certificate 指向该文件;私钥则通过 ssl_certificate_key 单独指向。跳过证书链是最常见的安装错误:证书在桌面浏览器中看起来没有问题,但在 Android、API 客户端以及像我们的 SSL Checker 这样的工具中却会失败。

步骤 1:将证书合并为一个文件

合并文件中证书的顺序很重要。您的服务器证书排在最前面,然后是从签发叶证书的 CA 向上的每个中间证书,根证书排在最后(或省略,因为浏览器已经信任其内置存储中的根证书):

  • 您域名的主证书。
  • 中间证书。
  • 根证书(可选)。

您可以在文本编辑器中手动构建 fullchain 文件(按顺序粘贴每个 PEM 块),也可以通过一条 cat 命令完成。如果您收到的是单独的中间证书和根证书文件,请运行:

cat your_domain.crt intermediate.crt root.crt > ssl-bundle.crt

如果中间证书和根证书已经合并在一个 .ca-bundle 文件中,请运行:

cat example_com.crt example_com.ca-bundle > ssl-bundle.crt

将文件名替换为您自己的文件名。将合并后的文件(以及私钥,如果尚未存在于该目录)移动到服务器上的 SSL 目录,例如 /etc/ssl//etc/nginx/ssl/。确保密钥文件只能由 root 读取:

sudo chmod 600 /etc/ssl/your_domain.key
sudo chown root:root /etc/ssl/your_domain.key

步骤 2:编辑 NGINX 配置文件

打开您网站的 NGINX 配置文件。在 Debian 和 Ubuntu 上,该文件位于 /etc/nginx/sites-available/(并在 sites-enabled/ 中有一个符号链接);在 RHEL、CentOS、AlmaLinux 和 Rocky Linux 上,则位于 /etc/nginx/conf.d/。添加或编辑监听 443 端口的 server 块,使其指向 fullchain 文件和私钥:

server {
    listen 443 ssl;
    http2 on;
    server_name example.com www.example.com;

    ssl_certificate     /etc/ssl/ssl-bundle.crt;
    ssl_certificate_key /etc/ssl/your_domain.key;

    # Modern TLS only
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;
    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;

    ssl_session_timeout 1d;
    ssl_session_cache shared:NginxSSL:10m;
    ssl_session_tickets off;

    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log;

    root /var/www/example.com;
    index index.html;

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

关于上述指令,有几点说明:

  • listen 443 ssl; 在 443 端口上启用 TLS。旧版的 ssl on; 指令已在 NGINX 1.25 中被移除,不应出现在现代配置中。
  • http2 on; 作为独立指令启用 HTTP/2(NGINX 1.25.1 及更高版本)。旧版配置使用 listen 443 ssl http2;,虽然仍可正常工作,但已被弃用。
  • ssl_protocols TLSv1.2 TLSv1.3; 禁用了过时的 TLS 1.0 和 1.1。从 NGINX 1.27.3 起,即使省略该指令,这也是默认设置,但显式设置是更清晰、更便于审计的做法。
  • 该密码套件列表与 Mozilla 的 “intermediate” 配置文件相匹配,可在所有较新的客户端上正常工作。如果您只需要支持 TLS 1.3 的客户端,可以完全省略 ssl_ciphers

步骤 3:将 HTTP 重定向到 HTTPS

在 80 端口添加一个单独的 server 块,将所有请求永久重定向到 HTTPS,这样通过普通 HTTP 访问的访客也会进入安全网址:

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

使用 return 301 比基于正则表达式的 rewrite 规则更快、更安全,也是 NGINX 官方推荐的做法。

步骤 4:测试配置并重新加载 NGINX

在重新加载之前,请务必先验证配置,以免拼写错误导致服务下线:

sudo nginx -t

您应该会看到 syntax is oktest is successful。如果报告了错误,消息中会包含文件名和行号;修正后请再次运行测试。测试通过后,重新加载 NGINX,使其应用新配置而不中断现有连接:

sudo systemctl reload nginx

在没有 systemd 的系统上,请改用 NGINX 自身的重新加载信号:

sudo nginx -s reload

请优先使用 reload 而非 restart:reload 会在不关闭现有连接的情况下重新读取配置,而 restart 会中断这些连接。

步骤 5(可选):启用 OCSP 装订

OCSP 装订让 NGINX 在证书旁附带一份最新的、经过签名的吊销状态信息,这样客户端就无需在每次握手时都联系 CA。请在您的 HTTPS server 块中添加以下内容:

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/ssl/ssl-bundle.crt;
resolver 1.1.1.1 8.8.8.8 valid=300s;
resolver_timeout 5s;

再次使用 sudo systemctl reload nginx 重新加载 NGINX。装订是一项虽小但很值得实施的加固措施,大多数现代证书都默认支持它。

验证安装

在浏览器中通过 https:// 打开您的网站,检查锁形图标是否已关闭,且证书与您的域名相匹配。然后使用我们的SSL Checker进行更深入的扫描,即时获取有关证书、证书链以及您服务器所提供的协议和密码套件的报告。若结果显示为绿色,则意味着各大主流平台上的客户端(包括移动端和 API 客户端)都将信任该证书。

常见问题

在 NGINX 上应该把 SSL 证书安装在哪里?

NGINX 本身并不要求特定的目录,但大多数管理员会将证书和密钥保存在 /etc/ssl//etc/nginx/ssl/ 下。然后在您的 server 块中通过 ssl_certificate(指向合并后的证书 + 中间证书文件)和 ssl_certificate_key(指向私钥)来引用它们。

为什么我的证书在 Chrome 中被信任,但在移动端或 API 客户端上却不被信任?

几乎总是因为缺少中间证书链。桌面浏览器可以自行获取缺失的中间证书(即 “AIA 获取”),但 Android、iOS 以及大多数命令行和编程语言的 HTTP 客户端无法做到这一点。请重新构建您的 fullchain 文件,使其包含服务器证书以及所有中间证书,然后将 ssl_certificate 指向该合并文件,重新加载 NGINX,并重新运行 SSL Checker。

编辑 NGINX 配置后,应该使用 restart 还是 reload?

使用 reload。sudo systemctl reload nginx(或 sudo nginx -s reload)会重新读取配置并平滑地替换工作进程,因此现有连接不会中断。完全重启会先停止再启动服务,配置更改时很少需要这样做。请务必先运行 sudo nginx -t,以便在重新加载前发现语法错误。

我的 server 块中还需要 ssl on; 吗?

不需要。独立的 ssl on; 指令已在 NGINX 1.15.0 中被弃用,并在 1.25 版本中被完全移除。在任何受支持的 NGINX 版本中,您应改用在 listen 行中添加 listen 443 ssl; 来启用 TLS。如果您复制的是旧版配置,请删除其中任何 ssl on; 这一行。

如何在 NGINX 上启用 HTTP/2(以及 HTTP/3)?

在您的 HTTPS server 块中使用专用的 http2 on; 指令(NGINX 1.25.1 及更高版本)。旧版语法将 http2 作为 listen 行的参数添加,虽然仍可正常工作,但已被弃用。HTTP/3(QUIC)自 NGINX 1.25 起得到支持,需要通过单独的 UDP 监听器(listen 443 quic reuseport;)加上 Alt-Svc 响应头来启用;它是可选的,可以在您网站上的 HTTP/2 稳定运行后再添加。

我需要多久更新一次证书?

截至 2026 年 3 月 15 日,受公开信任的 SSL/TLS 证书有效期上限为 200 天,CA/Browser Forum 已计划进一步缩短该期限(2027 年缩短至 100 天,2029 年缩短至 47 天)。请计划在每次到期前充分提前重复上述步骤,或使用 ACME 实现续期自动化。

立即订购 SSL 证书, 可节省 10% 的费用!

快速发行, 强大加密, 99.99% 的浏览器信任度, 专业支持和 25 天退款保证. 优惠券代码 SAVE10

龙飞行的详细图像
撰写人

经验丰富的内容撰稿人, 擅长 SSL 证书. 将复杂的网络安全主题转化为清晰, 引人入胜的内容. 通过有影响力的叙述, 为提高数字安全作出贡献.