一篇可直接照着操作的 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-> 你的服务器公网 IPwww.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 证书常见有两类工具:
certbotacme.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. 申请证书的两种常见方式
最常见的是:
--nginx--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
如果配置正确,应该能看到 301 或 308 跳转到 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 步:
- 域名解析到服务器
- 打开 80/443 端口
- 用
certbot申请证书 - 在 Nginx 中正确引用证书文件
- 在 Nginx 中启用 HTTPS 并做好自动续期
如果只是个人博客、静态站点或普通业务站,这套方案已经足够稳定,而且成本很低。
后面你真正要关心的,不是“证书怎么申请一次”,而是“证书三个月后还能不能无感续期”。
这也是 HTTPS 配置里最容易被忽略,但最重要的一步。
评论
加载中...