如何使用 Let's Encrypt
Certbot 是 Let's Encrypt 推荐的工具,用于自动化管理证书。
-
1. 安装 Certbot
- Ubuntu/Debian:
sudo apt update
sudo apt install certbot python3-certbot-apache
- CentOS/RHEL:
sudo yum install epel-release
sudo yum install certbot python3-certbot-nginx
-
2. 生成证书
根据你的 Web 服务器类型,选择适当的插件:
- Nginx:需要nginx运行在80端口
sudo certbot --nginx
- Apache:需要Apache运行在80端口
sudo certbot --apache
- 独立模式(无 Web 服务器):
sudo certbot certonly --standalone
执行命令时,Certbot 会:
验证你的域名所有权(通过 HTTP/HTTPS 或 DNS)。
自动配置服务器以启用 HTTPS(如使用 Nginx 或 Apache 插件)。
-
3. 验证 HTTPS 是否正常工作
使用浏览器访问你的域名,确保 HTTPS 正常运行并显示安全图标。
-
4. 证书续期
Let's Encrypt 的证书有效期为 90 天,续期成功后可以不需要去重新部署证书
-
验证续期命令是否有效
sudo certbot renew --dry-run
- renew:Certbot 会查找系统中已存在的证书,并尝试续订。
- --dry-run:模拟续订过程,不影响现有证书,也不会更改证书文件。
-
自动续期: 服务器可以开放80公网端口才可以使用(其实就是ACME验证服务器会发起一个http请求访问服务器);
使用如下生成证书命令才可自动续期(就是利用crontab脚本跑命令):
- nginx/apache: 需要运行在80端口 ;
- standalone+http: certbot会自己运行一个HTTP服务在指定端口
sudo certbot certonly --standalone --preferred-challenges http --http-01-port 8080
--http-01-port 参数的作用是让 Certbot 的临时服务器监听指定端口,但 ACME 协议仍要求验证请求通过 端口 80;
ACME访问地址示例: http://www.example.com/.well-known/acme-challenge/a0FmtqlEMyDkwAONv3iy-SvyTDQOcXh-2Z4op6IskHs
- 手动续期:
- 手动执行自动续期的操作(服务器可以开放80公网端口才可以使用);
- 使用 DNS 验证方法
-
生成证书(不需要服务器):
sudo certbot certonly --manual --preferred-challenges dns -d example.com -d *.example.com
过程中会需要输入联系的邮箱,并要求到域名服务商的管理页面配置一条DNS解析记录:
Please deploy a DNS TXT record under the name: _acme-challenge.example.com with the following value: abcd1234efgh5678ijkl91011mnopqrstu
添加如下记录:
- 记录名称(Host/Name): _acme-challenge.example.com
- 记录类型(Type): TXT
- 记录值(Value): abcd1234efgh5678ijkl91011mnopqrstu
- TTL: 设置为最小值(如 10 分钟)。
手动方式 DNS 续期:
sudo certbot renew --manual --preferred-challenges dns --dry-run
Certbot 会提示您在 DNS 中添加一条新的 TXT 记录。
-
特殊方案: 自动DNS验证方法续期
思路: DNS验证方法鉴权需要在域名服务商域名解析处
对数据: _acme-challenge.example.com 设置对应的记录值,
只需要域名服务商有支持修改域名解析的OpenApi即可
阿里云文档: https://help.aliyun.com/zh/dns/api-alidns-2015-01-09-updatedomainrecord
阿里云文档地址里面有调试功能,可以进去后调试好了直接下载代码使用
- 鉴权脚本: update-domain.sh
#!/bin/bash
# 打印所有环境变量(用于调试)
echo "DEBUG: Environment variables:"
env | grep CERTBOT
# Certbot 提供的环境变量
DOMAIN=$CERTBOT_DOMAIN # 当前验证的域名: Certbot命令运行时自动的环境变量,按参数名读取即可
VALIDATION=$CERTBOT_VALIDATION # Let’s Encrypt 提供的验证值: Certbot命令运行时自动的环境变量,按参数名读取即可
DOMAIN_ID=883195266900000000 # 阿里云域名RecordId: 可以在哪里云调试界面使用(DescribeDomainRecords - 获取解析记录列表)获取
ACCESS_KEY_ID=LTAI4GDiu2Yaaaaaaaaaaaaa # 阿里云accessKeyId: 阿里云单独申请子账号获取
ACCESS_KEY_SECRET=uUuQ9O0aaaaaaaaaaaaaaaaaaaaaaa # 阿里云accessKeySecret: 阿里云单独申请子账号获取,申请时记录好,后面不能查
# 本地 JAR 包路径: 使用阿里云调试获取的代码,自定义一次传入参数使用
JAR_PATH="/etc/letsencrypt/aliyun/ssl-certbot-1.0.0.jar"
# 调用 JAR 包更新 DNS
echo "Calling Java JAR to update DNS record..." >> ./updomain.log
echo "java命令参数: "$JAR_PATH" "--accessKeyId=$ACCESS_KEY_ID" "--accessKeySecret=$ACCESS_KEY_SECRET" "--domainId=$DOMAIN_ID" "--domainVal=$VALIDATION" >> ./updomain.log
java -jar "$JAR_PATH" "--accessKeyId=$ACCESS_KEY_ID" "--accessKeySecret=$ACCESS_KEY_SECRET" "--domainId=$DOMAIN_ID" "--domainVal=$VALIDATION"
# 检查 Java 命令的退出码: Java异常确认
if [ $? -ne 0 ]; then
log "Error: Failed to update DNS record using Java program."
# 发送通知(例如通过邮件或钉钉机器人)
# send_notification "DNS update failed for $DOMAIN"
exit 1 # 终止脚本,Certbot 将报告失败
fi
# 等待 DNS 生效(可根据实际情况调整时间)
echo "Waiting for DNS propagation..." >> ./updomain.log
sleep 30
echo "DNS record updated successfully for $DOMAIN" >> ./updomain.log
-
certbot续期脚本: renew-example.sh
#!/bin/bash
# 申请域名*.example.com SSL证书续期
certbot certonly --manual --preferred-challenges dns --agree-tos --manual-auth-hook /etc/letsencrypt/aliyun/update-domain.sh -d *.example.com --non-interactive >> /etc/letsencrypt/logs/renew-example.log 2>&1
-
命令解析
certbot certonly
启动 Certbot 以请求或续订证书,但只生成证书而不会安装到服务器中。
适用于你需要手动安装证书到服务器或其他服务时。
--manual
使用手动模式,要求用户手动完成 DNS 验证过程。通常适用于自动化程度较低的环境。
--preferred-challenges dns
指定优先使用 DNS 验证方法。
这种验证方式要求你在域名的 DNS 记录中添加一个 _acme-challenge 类型的 TXT 记录,以验证你对该域名的控制权。
特别适用于申请通配符证书(如 *.example.com),因为通配符证书只能通过 DNS 验证方式完成。
--agree-tos
自动同意 Let's Encrypt 的服务条款,避免手动确认。
适用于自动化脚本,跳过服务条款提示。
--manual-auth-hook /etc/letsencrypt/aliyun/update-domain.sh
指定一个自定义脚本(update-example.sh)来处理 DNS 验证过程。
这个脚本通常会自动更新 DNS 服务商的记录,例如在阿里云、腾讯云等平台添加 _acme-challenge 的 TXT 记录。
Certbot 在执行过程中会自动调用该脚本,并将验证值(通过环境变量如 $CERTBOT_VALIDATION 提供)传递给它。
-d *.example.com
指定申请的域名,这里是 *.example.com,表示申请一个通配符证书。
通配符证书允许为所有子域(如 www.example.com、api.example.com)提供 HTTPS 支持。
--non-interactive
禁止所有用户交互,确保命令在完全自动化的环境中运行。
如果某个操作需要用户输入,Certbot 会直接退出而不会暂停等待输入。
>> /etc/letsencrypt/logs/renew-example.log 2>&1
将命令的输出(包括标准输出和标准错误)追加到日志文件 renew-example.log 中,以便后续查看执行过程和可能的错误信息。
>> 表示追加(而不是覆盖)日志。
2>&1
表示将标准错误(文件描述符 2)重定向到标准输出(文件描述符 1)。
首次申请ssl证书时, 可以先运行命令
certbot certonly --manual --preferred-challenges dns --manual-auth-hook /etc/letsencrypt/aliyun/update-example.sh -d *.example.com --verbose
--verbose 参数以启用详细模式: