背景

Let’s Encrypt 证书申请与 Nginx 配置实战

发表于 2026/05/09 20:30
🌺 摘要
一篇可直接照着操作的 Let’s Encrypt 实战文章,涵盖前置条件、Certbot 申请方式、Nginx SSL 配置、HTTP 跳转 HTTPS 和自动续期。

如果你已经有一台 Linux 服务器和一个已解析到服务器公网 IP 的域名,那么用 Let’s Encrypt 配一套免费的 HTTPS 证书并不复杂。真正容易出问题的,反而是前置条件没检查、Nginx 配置顺序不对,或者证书虽然申请成功了但没有做好自动续期。

这篇文章按「能直接落地」的思路来写,默认场景如下:

  • 服务器系统:Linux
  • Web 服务:Nginx
  • 域名:已完成 DNS 解析
  • 证书工具:certbot

1. 先准备好这几个前置条件

在申请证书前,先确认下面几件事:

1.1 域名已经解析到服务器

例如:

  • example.com -> 你的服务器公网 IP
  • www.example.com -> 你的服务器公网 IP

如果解析没生效,Let’s Encrypt 无法验证域名归属,证书申请会失败。

1.2 服务器开放 80 和 443 端口

  • 80:用于 HTTP 访问,也常用于证书校验
  • 443:用于 HTTPS 访问

如果你用了云服务器安全组、防火墙或宝塔之类的面板,都要确认这两个端口已放行。

1.3 Nginx 已安装并可正常启动

先检查一下:

nginx -v
nginx -t

如果配置文件本身有语法问题,后面即使证书申请成功,Nginx 也可能起不来。


2. 为什么这里使用 Certbot

申请 Let’s Encrypt 证书常见有两类工具:

  • certbot
  • acme.sh

如果你本身就是通过 certbot 在做申请和续期,那文章最好也按这个工具来写。
certbot 的优点主要有:

  • 文档丰富,社区资料多
  • 与 Nginx、Apache 集成成熟
  • 自动续期机制成熟
  • 很多 Linux 发行版都能直接安装

常见安装方式如下。

2.1 Debian / Ubuntu

sudo apt update
sudo apt install certbot python3-certbot-nginx -y

2.2 CentOS / Rocky / AlmaLinux

sudo dnf install epel-release -y
sudo dnf install certbot python3-certbot-nginx -y

安装完成后先确认一下版本:

certbot --version

如果系统里没有 python3-certbot-nginx,也可以只装 certbot,后面改用 webroot 方式手动配 Nginx。


3. 申请证书的两种常见方式

最常见的是:

  1. --nginx
  2. --webroot

如果你的 Nginx 已经配置好了站点,并且愿意让 certbot 自动帮你写 SSL 配置,可以优先用 --nginx
如果你更想自己控制 Nginx 配置,建议用 --webroot


4. 用 nginx 插件方式申请证书

这是最省事的一种。

4.1 先确保 HTTP 站点可访问

例如:

http://example.com

能打开即可,不一定要先配 HTTPS。

4.2 执行申请命令

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

执行后它通常会做几件事:

  • 校验域名归属
  • 申请证书
  • 自动改写 Nginx 配置
  • 询问你是否把 HTTP 自动跳转到 HTTPS

5. 用 webroot 方式申请证书

如果你不想让 certbot 直接改 Nginx 配置,推荐用这个方式。

5.1 准备网站根目录

例如你的网站目录是:

/www/wwwroot/example

并确保你的 HTTP 站点配置可正常访问。


5.2 先准备一个 HTTP 站点

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

    root /www/wwwroot/example;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ /index.html;
    }
}

先检查配置并重载:

sudo nginx -t
sudo nginx -s reload

5.3 执行申请命令

sudo certbot certonly --webroot -w /www/wwwroot/example -d example.com -d www.example.com

说明:

  • certonly:只申请证书,不自动改 Nginx
  • --webroot:使用网站根目录进行域名校验
  • -w:指定网站目录
  • -d:指定域名

申请成功后,证书通常会放在:

/etc/letsencrypt/live/example.com/

6. Nginx 配置 HTTPS

如果你使用的是 --webroot 方式,接下来就需要手动把证书路径配到 Nginx。

6.1 443 配置示例

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

    root /www/wwwroot/example;
    index index.html index.htm;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;

    location / {
        try_files $uri $uri/ /index.html;
    }
}

6.2 HTTP 自动跳转 HTTPS

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

    return 301 https://$host$request_uri;
}

7. 完整站点配置示例

如果你是手动维护 Nginx,完整配置大概如下:

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

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

    root /www/wwwroot/example;
    index index.html index.htm;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;

    location / {
        try_files $uri $uri/ /index.html;
    }
}

改完后检查并重载:

sudo nginx -t
sudo systemctl reload nginx

8. 怎么确认 HTTPS 已经配置成功

可以从这几个角度检查:

8.1 浏览器访问

直接访问:

https://example.com

看地址栏是否出现安全锁图标。

8.2 curl 检查响应头

curl -I https://example.com

8.3 检查 HTTP 是否跳转

curl -I http://example.com

如果配置正确,应该能看到 301308 跳转到 https://example.com


9. Let’s Encrypt 证书会过期,必须做好续期

Let’s Encrypt 证书有效期通常是 90 天,所以自动续期不是可选项,而是必须项。

certbot 安装后通常会自动注册 systemd timer 或定时任务。可以先检查:

systemctl list-timers | grep certbot

也可以手动测试续期流程:

sudo certbot renew --dry-run

如果你使用的是 --nginx 模式,通常续期会比较顺滑。
如果你是手动维护 Nginx 配置,续期后一般证书路径不变,Nginx 继续引用同一路径即可。


10. 常见问题排查

10.1 申请失败:Invalid response

常见原因:

  • 域名没有正确解析到当前服务器
  • 80 端口没放行
  • Nginx 的 location 把校验路径拦截掉了
  • CDN 或反向代理把请求转乱了

10.2 certbot 提示找不到匹配的 server block

这通常出现在 --nginx 模式下,原因一般是:

  • server_name 没写对
  • Nginx 配置没有被 certbot 正确识别
  • 站点配置文件没启用

这种情况下,改用 --webroot 往往更稳。

10.3 证书续期成功,但站点还是旧证书

通常是这几个原因:

  • Nginx 没有 reload
  • 配置里引用了错误的证书路径
  • 引用的不是 /etc/letsencrypt/live/example.com/ 下的当前证书

10.4 浏览器提示证书链不完整

一般是因为用了错误的证书文件。
Nginx 通常应该配置 fullchain.pem,而不是只配单张证书。


11. 小结

把 Let’s Encrypt 配到线上,核心就 5 步:

  1. 域名解析到服务器
  2. 打开 80/443 端口
  3. certbot 申请证书
  4. 在 Nginx 中正确引用证书文件
  5. 在 Nginx 中启用 HTTPS 并做好自动续期

如果只是个人博客、静态站点或普通业务站,这套方案已经足够稳定,而且成本很低。
后面你真正要关心的,不是“证书怎么申请一次”,而是“证书三个月后还能不能无感续期”。

这也是 HTTPS 配置里最容易被忽略,但最重要的一步。

文章发表于 2026/05/09 20:30
上一篇 《忠诚》:改革深水区的人性光谱与时代镜像
下一篇 前端「宽与高」速查:视口、文档、元素与 CSS 单位

评论

加载中...