Certbot Nginx 安装指南:获取免费 Let’s Encrypt SSL 证书 – wiki基地


Certbot Nginx 安装指南:获取免费 Let’s Encrypt SSL 证书,让你的网站拥有绿色小锁

在当今互联网环境下,网站的安全性变得前所未有的重要。无论是保护用户数据、提升网站信誉,还是满足搜索引擎(如 Google)对 HTTPS 的偏好,为网站启用 SSL/TLS 加密已成为标配。启用 SSL/TLS 后,你的网站地址将以 https:// 开头,并且在大多数浏览器中会显示一个醒目的绿色小锁图标,向访问者表明连接是安全的。

然而,在过去,获取并安装 SSL 证书通常是一个复杂且昂贵的流程。你需要选择一个证书颁发机构 (CA),完成身份验证,支付年费,然后手动配置服务器。这对于个人站长或小型企业来说可能是一个不小的负担。

幸运的是,这一切在 Let’s Encrypt 出现后发生了改变。

什么是 Let’s Encrypt?

Let’s Encrypt 是一个免费、自动化、开放的证书颁发机构(CA),由互联网安全研究小组(ISR)运营。它的目标是让所有网站都能够轻松地使用 HTTPS。Let’s Encrypt 颁发的证书被所有主流浏览器信任,并且完全免费。

Let’s Encrypt 的核心特点是自动化。它通过自动化协议(称为 ACME 协议)来验证你对域名的所有权,并在验证成功后自动颁发证书。证书的有效期通常是 90 天,但同样可以通过自动化工具轻松续期,无需手动干预。

什么是 Certbot?

Certbot 是由电子前哨基金会(EFF)开发的一个易于使用的客户端,它是与 Let’s Encrypt 交互的最流行工具。Certbot 可以自动执行获取和安装 Let’s Encrypt 证书的大部分步骤。特别是对于常见的 Web 服务器软件,如 Apache 和 Nginx,Certbot 提供了插件,可以自动修改服务器配置,启用 HTTPS,甚至设置 HTTP 到 HTTPS 的重定向。

本篇文章将重点介绍如何在 Nginx 服务器上使用 Certbot 来获取和安装免费的 Let’s Encrypt SSL 证书。

为什么选择 Nginx + Certbot + Let’s Encrypt?

  • Nginx: 一个高性能、稳定且资源消耗低的 Web 服务器,广泛应用于各种规模的网站。
  • Certbot: Let’s Encrypt 官方推荐的客户端,自动化程度高,易于使用,支持 Nginx 插件,能够自动配置服务器。
  • Let’s Encrypt: 提供免费、自动化、受信任的 SSL 证书,消除了证书成本和手动管理的负担。

将这三者结合起来,你可以高效、免费地为你的 Nginx 网站启用 HTTPS。

前期准备

在开始安装和配置之前,请确保你满足以下条件:

  1. 一台运行 Linux 的服务器: Certbot 主要运行在 Linux 环境下。本指南将以 Ubuntu/Debian 或 CentOS/RHEL 系列发行版为例。
  2. 已安装并运行 Nginx: 你的服务器上需要已经安装了 Nginx,并且你的网站已经在 Nginx 上配置好并可以通过 HTTP (端口 80) 正常访问。
  3. 拥有一个域名: 你需要拥有一个域名(例如 yourdomain.com),并且该域名已经通过 DNS A/AAAA 记录指向你的服务器的公网 IP 地址。Certbot 需要验证你对该域名的所有权。
  4. SSH 访问权限: 你需要通过 SSH 连接到你的服务器,并拥有 sudo 权限或 root 权限来安装软件和修改系统配置。
  5. 确保端口 80 和 443 可访问: Certbot 在验证域名时通常需要访问端口 80。安装证书后,HTTPS 默认使用端口 443。请确保你的服务器防火墙(如 iptables, firewalld, UFW)允许外部访问这两个端口。

重要提示: 在继续之前,请检查你的 Nginx 配置文件,确保你的网站的 server 块中包含了正确的 server_name 指令,并且该指令指定了你想要获取证书的域名。Certbot 会读取这个指令来确定要为哪个域名颁发证书并修改哪个配置文件。

例如,你的 Nginx 配置文件 (/etc/nginx/sites-available/your_site.conf/etc/nginx/conf.d/your_site.conf) 中应该有类似如下的内容(端口 80 的配置):

“`nginx
server {
listen 80;
server_name yourdomain.com www.yourdomain.com; # 替换为你的域名
root /var/www/your_website; # 替换为你的网站根目录
index index.html; # 替换为你的入口文件

# 其他网站配置...

}
“`

确保 server_name 行是正确且存在的。

Certbot 安装步骤详解

Certbot 的安装方法有几种,最推荐的是使用系统的包管理器进行安装,因为它最简单,并且能确保 Certbot 及其依赖得到及时更新。Certbot 官方也推荐这种方式。

我们将分别介绍在基于 Debian/Ubuntu 和基于 RHEL/CentOS/AlmaLinux/Rocky Linux 的系统上的安装方法。

方法一:在 Debian 或 Ubuntu 系统上安装 Certbot

  1. 更新系统包列表:
    在终端中运行以下命令,确保你的包管理器知道最新的软件包信息:

    bash
    sudo apt update

  2. 安装 Certbot 和 Nginx 插件:
    Certbot 提供了专门用于 Nginx 的插件,它可以自动修改 Nginx 配置。安装 Certbot 及其 Nginx 插件:

    bash
    sudo apt install certbot python3-certbot-nginx

    certbot 是 Certbot 主程序,python3-certbot-nginx 是用于 Nginx 的 Python 插件。

  3. 安装完成:
    耐心等待安装过程完成。安装成功后,Certbot 就已经准备好在你的系统上运行了。

方法二:在 CentOS、RHEL、AlmaLinux 或 Rocky Linux 系统上安装 Certbot

在这些基于 RHEL 的系统上,Certbot 通常位于 EPEL (Extra Packages for Enterprise Linux) 仓库中。你需要先启用 EPEL 仓库。

  1. 启用 EPEL 仓库:
    对于 CentOS 8/9, RHEL 8/9, AlmaLinux 8/9, Rocky Linux 8/9,使用 dnf:

    bash
    sudo dnf install epel-release
    sudo dnf clean all

    对于 CentOS 7 或 RHEL 7,使用 yum:

    bash
    sudo yum install epel-release
    sudo yum clean all

  2. 安装 Certbot 和 Nginx 插件:
    现在可以使用 dnf 或 yum 安装 Certbot 和 Nginx 插件:

    对于 CentOS 8/9, RHEL 8/9, AlmaLinux 8/9, Rocky Linux 8/9 (dnf):

    bash
    sudo dnf install certbot python3-certbot-nginx

    对于 CentOS 7 或 RHEL 7 (yum):

    bash
    sudo yum install certbot python-certbot-nginx # 注意这里插件的包名可能略有不同

    注意: 在 CentOS 7 等较老的系统上,Python 2 是默认的,所以插件包名可能是 python-certbot-nginx。在较新的系统上(CentOS 8+, RHEL 8+),Python 3 是默认的,所以包名是 python3-certbot-nginx。请根据你的系统版本选择正确的包名。如果不确定,可以尝试其中一个,如果找不到再尝试另一个,或者使用包管理器搜索 (yum search certbot-nginxdnf search certbot-nginx)。

  3. 安装完成:
    等待安装完成。Certbot 及其 Nginx 插件现在应该已经安装好了。

使用 Certbot 获取并安装 SSL 证书

安装完 Certbot 和 Nginx 插件后,就可以运行 Certbot 来获取证书并让它自动配置 Nginx 了。

  1. 运行 Certbot 命令:

    打开终端,运行以下命令:

    bash
    sudo certbot --nginx

    这个命令会启动 Certbot 的 Nginx 插件。Certbot 会尝试读取你的 Nginx 配置文件,找到 server_name 指令,并识别出你配置的域名。

  2. Certbot 交互过程:

    运行命令后,Certbot 会进入一个交互式会话:

    • 第一步:输入邮箱地址:
      Certbot 会提示你输入一个邮箱地址。这个邮箱地址将用于接收 Let’s Encrypt 关于证书到期或安全通知等重要信息。输入你的邮箱并按回车。

      Enter email address (used for urgent renewal and security notices) (Enter 'c' to
      cancel):

    • 第二步:同意 Let’s Encrypt 服务条款:
      Certbot 会显示 Let’s Encrypt 的服务条款链接,并询问你是否同意。阅读条款(如果需要),然后输入 A 表示同意,按回车。

      Please read the Terms of Service at
      https://letsencrypt.org/documents/ and Agree to them.
      (A)gree/(C)ancel:

    • 第三步:是否分享邮箱给 EFF:
      Certbot 可能会询问你是否愿意与 EFF 分享你的邮箱地址,以接收有关 EFF 工作的信息。这是一个可选步骤。输入 Y 同意或 N 拒绝,按回车。

      Would you be willing to share your email address with the EFF, a founding partner
      of the Let's Encrypt project and the non-profit organization that develops
      Certbot? We'd like to send you about our work encrypting the web, EFF news,
      campaigns, and ways to support digital freedom.
      (Y)es/(N)o:

    • 第四步:选择要为其颁发证书的域名:
      Certbot 会扫描你的 Nginx 配置,列出它找到的所有域名(基于 server_name 指令)。如果你的 Nginx 配置了多个网站或一个网站有多个域名(例如 yourdomain.comwww.yourdomain.com),Certbot 会让你选择要为其颁发证书的域名。

      它会列出类似这样的编号列表:

      “`
      Which names would you like to activate HTTPS for?


      1: yourdomain.com
      2: www.yourdomain.com


      Select the appropriate numbers separated by commas and/or spaces, or leave blank
      to select all options shown (and enable HTTPS in all of them):
      “`

      你可以输入编号来选择特定的域名(例如 1,2),或者直接按回车键来为列表中的 所有 域名颁发证书并启用 HTTPS。对于一个网站的多个域名(如带 www 和不带 www),通常建议为所有相关域名都申请证书。

    • 第五步:选择是否强制将 HTTP 重定向到 HTTPS:
      Certbot 还会询问你是希望同时保留 HTTP 和 HTTPS 访问,还是强制将所有 HTTP 请求重定向到 HTTPS。强烈建议选择强制重定向,以确保所有访问者都通过加密连接访问你的网站。

      “`
      Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.


      1: No redirect – Make no further changes to the webserver configuration.
      2: Redirect – Make all requests redirect to secure HTTPS access. Choose this for
      new sites, or if you’re confident your site works on HTTPS. You can
      undo this change by editing your web server’s configuration file.


      Select the appropriate number [1-2] then [enter] (press ‘c’ to cancel):
      “`

      输入 2 并按回车键,选择强制重定向。

  3. Certbot 执行操作:
    在你做出选择后,Certbot 会开始执行以下操作:

    • 连接到 Let’s Encrypt 服务器,请求证书。
    • 执行域名所有权验证(通常是 http-01 挑战)。Certbot 的 Nginx 插件会自动处理这个过程,可能会临时启动一个内置的 Web 服务器或修改 Nginx 配置来响应验证请求。
    • 如果验证成功,Let’s Encrypt 会颁发证书,Certbot 会下载证书文件。
    • Certbot Nginx 插件会自动修改你的 Nginx 配置文件,在对应的 server 块中添加 listen 443 ssl; 指令,配置 ssl_certificatessl_certificate_key 指向新下载的证书文件。如果选择了重定向,它还会修改端口 80 的 server 块,添加重定向规则。
    • Certbot 会自动重新加载或重启 Nginx 服务,使配置生效。
  4. 成功提示:
    如果一切顺利,你会看到类似以下的成功提示:

    “`
    IMPORTANT NOTES:
    – Congratulations! Your certificate and chain have been saved at:
    /etc/letsencrypt/live/yourdomain.com/fullchain.pem
    Your key file has been saved at:
    /etc/letsencrypt/live/yourdomain.com/privkey.pem
    Your certificate will expire on 2024-10-26. To obtain a new or
    tweaked version of this certificate in the future, simply run
    certbot again. To non-interactively renew all of your
    certificates, run “certbot renew”
    – If you like Certbot, please consider supporting our work by:

    Donating to EFF at https://eff.org/donate-le
    Donating to ISRG / Let’s Encrypt at https://letsencrypt.org/donate
    “`

    这个提示告诉你证书文件的存放位置 (/etc/letsencrypt/live/yourdomain.com/),证书的过期日期,以及如何手动续期(尽管 Certbot 会自动设置续期)。

验证 SSL 证书安装

证书安装成功后,你需要验证一下:

  1. 在浏览器中访问网站:
    打开你的网站,确保使用 https://yourdomain.com 地址访问。你应该能看到地址栏出现一个绿色小锁图标,表示连接是安全的。同时,尝试使用 http://yourdomain.com 访问,如果选择了强制重定向,它应该会自动跳转到 HTTPS 地址。

  2. 检查 Nginx 配置:
    Certbot 修改了你的 Nginx 配置文件。你可以打开对应的文件(例如 /etc/nginx/sites-available/your_site.conf/etc/nginx/conf.d/your_site.conf)查看改动。你会看到 Certbot 添加了一个新的 server 块用于处理 HTTPS,或者在原有的 server 块中添加了 listen 443 ssl; 以及 ssl_certificatessl_certificate_key 指令。

    例如,一个修改后的配置可能看起来像这样:

    “`nginx
    server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    # Certbot 添加的 HTTP 到 HTTPS 重定向
    return 301 https://$host$request_uri;
    }

    server {
    listen 443 ssl; # Certbot 添加的 HTTPS 监听
    server_name yourdomain.com www.yourdomain.com; # 你的域名

    # Certbot 添加的 SSL 证书路径
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; # 完整证书链
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # 私钥
    
    # Certbot 可能还会添加一些 SSL 相关的优化配置
    include /etc/letsencrypt/options-ssl-nginx.conf; # 通常包含 SSL 协议和加密套件的推荐设置
    # Certbot 自动生成的用于 HTTP-01 验证的目录(在首次获取证书时可能存在)
    # include /etc/letsencrypt/nginx.conf;
    
    root /var/www/your_website; # 你的网站根目录
    index index.html; # 你的入口文件
    
    # 其他网站配置...
    

    }
    “`

    请注意 include /etc/letsencrypt/options-ssl-nginx.conf; 这一行。Certbot 通常会创建一个包含推荐的 SSL 设置(如 TLS 版本、加密套件)的文件,并将其包含在你的 Nginx 配置中,以增强安全性。

  3. 使用在线 SSL 检查工具:
    使用 SSL Labs’ SSL Server Test (https://www.ssllabs.com/ssltest/) 等在线工具来扫描你的网站。这个工具会给你一个详细的 SSL 配置评分,包括证书链是否完整、支持哪些 TLS 版本和加密套件、是否存在漏洞等。使用 Certbot 默认配置通常能获得 A 或 A+ 的评分。

证书的自动续期

Let’s Encrypt 证书的有效期只有 90 天。虽然你可以手动运行 sudo certbot renew 来续期,但这并不符合 Let’s Encrypt 自动化的理念。Certbot 在安装时通常会自动在你的系统上设置一个计划任务(cron job 或 systemd timer)来定期检查并续期证书。

工作原理:

  • Certbot 会安装一个脚本(通常在 /etc/cron.d/certbot 或作为 systemd timer certbot.timer)。
  • 这个脚本每天会运行一到两次 certbot renew 命令。
  • certbot renew 命令会检查所有由 Certbot 管理的证书,如果证书在未来 30 天内到期,它就会尝试进行续期。
  • 续期过程类似于首次获取证书时的域名验证,Certbot 会再次与 Let’s Encrypt 服务器通信。
  • 如果续期成功,Certbot 会下载新的证书文件,并自动重新加载(或重启)Nginx 配置,使其加载新的证书。
  • 如果证书离到期还早(超过 30 天),certbot renew 不会做任何事情。

测试自动续期:

你可以通过运行带 --dry-run 参数的 certbot renew 命令来测试自动续期过程,而不会真正续期或修改文件。这有助于检查自动续期是否能够正常工作。

bash
sudo certbot renew --dry-run

如果测试成功,你应该会看到类似这样的输出,表示续期过程没有问题:

“`


** Dry Run successful. **
Your certificates will be renewed when they become due.


“`

如果测试失败,输出会包含错误信息,你需要根据错误信息进行排查(常见问题包括防火墙阻止验证流量、Nginx 配置问题、DNS 问题等)。

检查自动续期任务:

你可以检查你的系统是否已经设置了自动续期任务:

  • 对于使用 cron 的系统: 检查 /etc/cron.d/certbot 文件是否存在。
    bash
    cat /etc/cron.d/certbot

    如果文件存在,你会看到一个 cron 任务,例如:
    # /etc/cron.d/certbot: crontab entries for the certbot package
    #
    # Upstream recommends attempting renewal twice a day
    #
    # Gave this a reasonable randomization:
    0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew

    这表示每天会尝试续期两次。

  • 对于使用 systemd timer 的系统: 检查 certbot.timer 是否启用。
    bash
    sudo systemctl list-timers | grep certbot

    如果启用,你会看到类似这样的输出:
    NEXT LEFT LAST PASSED UNIT ACTIVATES
    Fri 2023-01-01 12:34:56 UTC 10h left Thu 2023-12-31 01:23:45 UTC 1 day ago certbot.timer certbot.service

    这意味着 certbot.timer 定时器已经设置并正在运行。

通常情况下,Certbot 的安装脚本会自动为你配置好这些,你无需手动设置。定期运行 sudo certbot renew --dry-run 是一个很好的习惯,可以确保在证书真正到期前发现潜在的续期问题。

进阶配置和故障排除

证书文件位置

Certbot 将证书文件存储在 /etc/letsencrypt/ 目录下。对于你的域名 yourdomain.com,相关的证书文件会存放在 /etc/letsencrypt/live/yourdomain.com/ 目录中。这个目录通常包含以下文件:

  • fullchain.pem: 包含你的服务器证书和中间证书链。这是 Nginx 配置中 ssl_certificate 通常应该指向的文件。
  • privkey.pem: 你的证书对应的私钥文件。Nginx 配置中 ssl_certificate_key 应该指向这个文件。
  • chain.pem: 只包含中间证书链。
  • cert.pem: 只包含你的服务器证书。

/etc/letsencrypt/live/yourdomain.com/ 目录中的文件实际上是指向 /etc/letsencrypt/archive/yourdomain.com/ 目录中最新证书版本的符号链接。这样做是为了方便管理和续期,Nginx 配置只需要指向 live 目录中的固定路径即可。

手动配置 Nginx (如果 Certbot 自动配置失败或使用了 certonly)

如果你使用了 certonly 参数(例如 sudo certbot certonly --nginx)来只获取证书而不自动修改 Nginx 配置,或者 Certbot 自动配置失败,你需要手动修改 Nginx 配置文件。

  1. 备份 Nginx 配置:
    在修改任何配置文件之前,请务必备份原始文件。
    bash
    sudo cp /etc/nginx/sites-available/your_site.conf /etc/nginx/sites-available/your_site.conf.bak
    # 或者备份 conf.d 目录下的文件
    sudo cp /etc/nginx/conf.d/your_site.conf /etc/nginx/conf.d/your_site.conf.bak

  2. 编辑 Nginx 配置文件:
    使用文本编辑器打开你的网站配置文件,例如 sudo nano /etc/nginx/sites-available/your_site.conf

  3. 添加 HTTPS Server 块或修改现有 Server 块:

    选项 A: 在现有 HTTP 块中添加 HTTPS(不推荐,推荐分离)
    “`nginx
    server {
    listen 80;
    listen 443 ssl; # 同时监听 HTTPS 端口
    server_name yourdomain.com www.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; # 证书路径
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # 私钥路径
    
    # 推荐包含 Certbot 提供的 SSL 配置选项
    include /etc/letsencrypt/options-ssl-nginx.conf;
    # 如果需要 HTTP 到 HTTPS 重定向,在这里添加条件判断
    if ($scheme = http) {
        return 301 https://$host$request_uri;
    }
    
    root /var/www/your_website;
    index index.html;
    # ... 其他网站配置
    

    }
    “`
    这种方式虽然简单,但不够清晰,推荐使用选项 B。

    选项 B: 分离 HTTP 和 HTTPS Server 块 (推荐)
    保留原来的端口 80 的 server 块,用于处理 HTTP 请求并重定向到 HTTPS。新增一个端口 443 的 server 块来处理 HTTPS 请求。

    “`nginx

    HTTP 块 (处理 HTTP 请求并重定向)

    server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;

    # Certbot 的验证目录 (仅在需要手动HTTP-01验证时可能需要)
    # location /.well-known/acme-challenge/ {
    #     root /var/www/html; # 或 Certbot 提示的验证目录
    # }
    
    # 所有其他 HTTP 请求重定向到 HTTPS
    return 301 https://$host$request_uri;
    

    }

    HTTPS 块 (处理 HTTPS 请求)

    server {
    listen 443 ssl;
    server_name yourdomain.com www.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; # 证书路径
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # 私钥路径
    
    # 推荐包含 Certbot 提供的 SSL 配置选项
    include /etc/letsencrypt/options-ssl-nginx.conf;
    # 通常 Certbot 也会生成并包含一个 nginx.conf 用于验证等,但如果使用 --nginx 插件自动配置,它会处理得更智能
    # include /etc/letsencrypt/nginx.conf;
    
    root /var/www/your_website;
    index index.html;
    # ... 其他网站配置
    

    }
    ``
    这种方式清晰明了,易于管理。Certbot 的
    –nginx` 插件通常会采用类似这种分离配置的方式。

  4. 检查 Nginx 配置语法:
    在重新加载或重启 Nginx 之前,务必检查配置文件语法是否有误:
    bash
    sudo nginx -t

    如果语法正确,会显示 syntax is oktest is successful。如果报错,根据提示修改配置文件。

  5. 重新加载或重启 Nginx:
    让 Nginx 加载新的配置:
    bash
    sudo systemctl reload nginx # 或 sudo systemctl restart nginx

增强 SSL 安全性 (可选)

Certbot 提供的 options-ssl-nginx.conf 文件已经包含了相对安全的默认设置。但如果你想进一步优化,可以手动调整或添加配置:

  • HSTS (HTTP Strict Transport Security): 强制浏览器在一段时间内只能通过 HTTPS 访问你的网站,即使访问者输入的是 http://。这有助于防范中间人攻击。在你的 HTTPS server 块中添加:
    nginx
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";

    max-age 是过期时间(秒),includeSubDomains 应用于所有子域名,preload 是一个可选的注册机制(需要向 HSTS preload list 提交你的域名)。

  • OCSP Stapling: 允许服务器在 TLS 握手时直接提供证书的 OCSP 状态(由 CA 签名),而不是让浏览器单独去查询。这提高了隐私性(CA 不知道谁访问了你的网站)和速度。Certbot 的 options-ssl-nginx.conf 通常已包含此设置。你也可以手动添加:
    nginx
    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; # 指定一个可靠的DNS服务器来解析OCSP响应服务器的地址
    resolver_timeout 5s;

    注意 ssl_trusted_certificate 应该指向包含中间证书的文件(chain.pem),而不是 fullchain.pem

常见故障排除

  • 防火墙问题: 确保服务器的防火墙允许外部访问端口 80 (用于验证) 和 443 (用于 HTTPS)。检查 UFW, firewalld, iptables 等配置。
    • UFW 例子: sudo ufw allow 'Nginx Full' (如果你已经设置了 Nginx 的 UFW 应用 profile) 或 sudo ufw allow 80,443/tcp
    • firewalld 例子: sudo firewall-cmd --permanent --add-service=http --add-service=https, sudo firewall-cmd --reload
  • Nginx 配置错误: 运行 sudo nginx -t 检查 Nginx 配置语法。Certbot 修改配置后,如果语法错误,Nginx 可能无法启动或重新加载。
  • server_name 不匹配: Certbot 依赖于 server_name 指令来确定要处理哪个域名和哪个配置文件。确保你的 Nginx 配置文件中的 server_name 与你想要申请证书的域名完全匹配,并且没有拼写错误。
  • DNS 未传播: 如果你刚刚修改了域名的 DNS 记录指向新的服务器 IP,可能需要一些时间(几分钟到几小时不等)让 DNS 变更在全球范围内传播。Certbot 在验证域名时,会通过 Let’s Encrypt 的服务器查询你的域名的 DNS 记录,如果查到的 IP 地址不是你当前运行 Certbot 的服务器的 IP,验证就会失败。等待 DNS 生效后再试。
  • Let’s Encrypt 速率限制: Let’s Encrypt 对同一域名或 IP 地址在一定时间内的证书请求次数有限制。如果你反复尝试获取证书失败,可能会遇到速率限制。通常情况下,这些限制比较宽松,但在频繁失败时需要注意。可以在 Let’s Encrypt 官方网站查看当前的速率限制政策。如果是测试,尽量使用 Certbot 的 --dry-run 参数。
  • Certbot 无法找到 Nginx 配置文件: 如果你的 Nginx 配置文件不在 Certbot 默认扫描的目录(如 /etc/nginx/sites-available/, /etc/nginx/sites-enabled/, /etc/nginx/conf.d/)或者使用了不标准的结构,Certbot 可能无法自动找到你的网站配置。在这种情况下,你可以考虑使用 certonly 模式获取证书,然后手动配置 Nginx。
  • 旧的 TLS 版本或加密套件警告: SSL Labs 测试如果给出关于 TLS 版本或加密套件的警告,通常可以通过修改 Nginx 配置中的 ssl_protocolsssl_ciphers 指令来解决。Certbot 的 options-ssl-nginx.conf 应该已经提供了不错的默认值,但你可以根据需要进行调整,参考 Mozilla SSL Configuration Generator (https://ssl-config.mozilla.org/) 获取推荐配置。

撤销证书 (不常用)

如果你的私钥泄露,或者你不再使用某个域名,你可能需要撤销证书。可以使用 Certbot 进行撤销:

bash
sudo certbot revoke --cert-path /etc/letsencrypt/live/yourdomain.com/fullchain.pem --reason keycompromise

--reason 替换为适当的原因(如 unspecified, keycompromise, affiliationchanged, superseded, cessationOfOperation)。撤销后,你应该立即获取并安装一个新的证书。

总结

通过 Certbot 和 Let’s Encrypt,为你的 Nginx 网站启用 HTTPS 已经变得非常简单和免费。整个过程主要包括安装 Certbot 及其 Nginx 插件,运行 sudo certbot --nginx 命令并按照提示进行操作,最后验证安装结果。Certbot 的自动化续期功能极大地减轻了维护负担,确保你的网站始终使用有效的 SSL 证书。

启用 HTTPS 不仅仅是一个技术配置,更是提升用户信任、保护数据安全、改善搜索引擎排名的重要一步。遵循本指南,你就可以轻松地为你的网站添加那个绿色的安全小锁了!记住定期检查自动续期是否工作正常,并关注 Certbot 和系统的更新,以确保安全性和稳定性。

希望这篇详细的指南能帮助你顺利地为你的 Nginx 网站获取并安装 Let’s Encrypt SSL 证书!


发表评论

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

滚动至顶部