前言
在如今的互联网环境下,HTTP(超文本传输协议)已经是“不安全”的代名词。HTTP 采用明文形式传输数据,信息在客户端与服务器之间的传递过程中,容易被中间节点窃听或篡改。而 HTTPS 在 HTTP 的基础上引入了 SSL/TLS 加密层,通过对传输数据进行加密,确保了通信过程的私密性与数据完整性。因此,无论是出于 SEO、数据加密的考虑,还是为了配合 Cloudflare 等 CDN 服务,为 VPS 上的服务配置 SSL 证书都是必要环节。
Nginx 是一款高性能的 HTTP 和反向代理服务器,常用于处理流量分发与后端服务代理。而在众多的证书获取方案中,Certbot 是申请 Let’s Encrypt 免费证书的常用工具。它的优势在于支持自动化操作,能够自动完成证书的申请、验证与后续续签,有效降低了手动维护的成本。
本文将介绍如何配置 Nginx,并利用 Certbot 实现 SSL 证书的自动化申请与续签流程。
环境准备
在开始之前,请确保你已经:
- 拥有一台安装了 Linux(如 Ubuntu/Debian)的 VPS。
- 拥有一个域名并已正确解析到该 VPS 的 IP。
- VPS 开放了 80 和 443 端口。
配置教程
安装 Nginx
在 Ubuntu/Debian 系统中,可以使用以下命令:
sudo apt updatesudo apt install nginx -y安装完成后,确保 Nginx 处于运行状态,并建议将其设置为开机自启:
sudo systemctl start nginxsudo systemctl enable nginx安装 Certbot
在 Ubuntu/Debian 系统中,可以使用以下命令:
sudo apt install certbotsudo apt install python3-certbot-nginx创建 Nginx 配置文件
要申请证书,需要先为你的服务写好 Nginx 配置文件。如果你已经写好了配置文件可以跳过这步。
新建配置文件:
sudo touch /etc/nginx/conf.d/yourdomain.com.conf # 改为你的域名编辑配置文件:
sudo nano /etc/nginx/conf.d/yourdomain.com.conf # 改为你的域名根据你的服务需要,修改配置文件,以下仅是一个示例,请自行修改:
server { listen 80; server_name yourdomain.com; # 改为你的域名
root /var/www/html; # 输入网站根目录 index index.html; # 输入首页 html
location / { try_files $uri $uri/ =404; }}编辑完成后,Ctrl + O 写入并保存,Ctrl + X 退出编辑器。
申请证书
通过前面的步骤我们已经配置好了 Nginx,下面进行证书申请操作。
IMPORTANT请确保域名已解析到该 VPS,并开放了 80、443 端口。
使用下面的命令申请证书:
sudo certbot --nginx -d yourdomain.com # 改为你的域名NOTECertbot 会自动识别
server_name为你申请证书并修改配置文件,把 HTTP 重定向到 HTTPS。
检查证书状态
证书申请完成后,我们需要检查证书状态,确保配置已经生效且没有安全漏洞。 最直观的方法是使用浏览器访问你的网站,点击地址栏的“锁”图标查看证书详情。
对于生产环境,推荐使用专业的在线工具进行扫描,这不仅能验证证书,还能检查你的 Nginx SSL 配置是否存在安全隐患(如弱加密套件):访问 Qualys SSL Labs Test↗ ,输入你的域名进行检测。通常拿到 A 或 A+ 评分才算合格。
自动化续签
Let’s Encrypt 的证书有效期只有 90 天,但 Certbot 默认会安装一个定时任务(cron job)来处理续签。
你可以通过以下命令模拟续签流程,检查是否配置成功:
sudo certbot renew --dry-run进阶使用方法
Standalone 模式
如果你的后端服务暂未运行,或者你不想让 Certbot 修改你的 Nginx 配置文件,可以使用 Standalone 模式。Certbot 会在本地临时开启一个监听 80 端口 的服务,向 Let’s Encrypt 证明这个域名确实指向这台 VPS。在验证期间,80 端口必须是空闲的,因此在运行前要停止 Nginx。该模式的缺点也显而易见,在验证期间,Nginx 会短暂不可用。
为了实现后续的自动化续签,建议在申请证书时就直接加上 pre-hook(续签前操作)和 post-hook(续签后操作)参数:
sudo certbot certonly --standalone -d yourdomain.com --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx" # 改为你的域名参数说明:
--pre-hook "systemctl stop nginx":在验证开始前,自动停止 Nginx 以释放 80 端口。--post-hook "systemctl start nginx":在验证完成(无论成功或失败)后,自动重新启动 Nginx。
DNS 验证模式
如果你想申请通配符证书,让 *.yourdomain.com 及其主域名都共用一张证书,则必须使用 DNS 验证:
sudo certbot certonly --manual --preferred-challenges dns -d "*.yourdomain.com" -d yourdomain.com # 改为你的域名按照提示去你的域名服务商(如 Cloudflare/腾讯云)后台添加一条 TXT 解析记录,确认解析生效后再按回车。
NOTE手动 DNS 验证模式不支持自动续签,若要自动续签需要安装并配置对应服务商的插件,如
certbot-dns-cloudflare。
常见问题排查(FAQ)
验证失败 (Challenge failed):检查防火墙是否开启了 80 端口,或者是否有其他程序占用了端口。
Too Many Requests:Let’s Encrypt 对单位时间内申请证书的次数有限制,调试时建议加上 --staging 参数。
反代 502 问题:如果申请证书是为了反代,请确保 Nginx 配置中的 proxy_pass 指向了正确的后端地址。
附录
Nginx 常用命令
sudo systemctl enable nginx # 设置开机自启sudo systemctl status nginx # 查看 Nginx 运行状态sudo nginx -t # 检查配置文件语法是否正确sudo nginx -s reload # 平滑重新加载配置(不中断服务)sudo systemctl start nginx # 启动 Nginxsudo systemctl stop nginx # 停止 Nginxsudo systemctl restart nginx # 重启 NginxCertbot 常用命令
sudo certbot --version # 查看 Certbot 版本sudo certbot certificates # 列出所有证书及有效期sudo certbot renew # 手动尝试续签所有证书sudo certbot renew --dry-run # 模拟续签流程sudo certbot delete # 交互式删除证书sudo certbot revoke --cert-name yourdomain.com # 撤销指定的证书