Lego 是一款用 Go 语言编写的轻量级 ACME 客户端,它原生支持阿里云 DNS(alidns)、腾讯云DNS(tencentcloud)等众多DNS提供商的插件。
下面以阿里云为例,使用Lego并结合阿里云 DNS 的 API 接口, 可以实现通配符 SSL 证书的自动申请、签发以及定时续期的功能。
第一步:准备阿里云 API 密钥(关键)
为了让 Lego 能够自动在你的阿里云 DNS 上添加 TXT 验证记录,需要给它授权。
登录阿里云控制台,进入 访问控制 (RAM)。
创建一个新的 RAM 用户(比如命名为
lego-dns),访问方式勾选 OpenAPI 调用访问。为该用户添加权限:直接赋予
AliyunDNSFullAccess(管理云解析 DNS 的权限)即可。创建完成后,保存好生成的 AccessKey ID 和 AccessKey Secret。
第二步:安装 Lego 客户端
Lego 最大的优点就是“无依赖”,它是一个单独的二进制文件。
# 1. 下载最新版本的 Lego (请自行替换版本号,这里以 v4.x 为例)
wget https://github.com/go-acme/lego/releases/download/v4.16.1/lego_v4.16.1_linux_amd64.tar.gz
# 2. 解压并赋予执行权限
tar -xvf lego_v4.16.1_linux_amd64.tar.gz
chmod +x lego
# 3. (可选) 移动到系统 PATH 路径下,方便全局调用
mv lego /usr/local/bin/(注:如果 GitHub 下载太慢,也可以在阿里云服务器上配置代理或使用国内镜像加速)
第三步:编写证书申请与自动更新脚本
为了避免每次手敲长长的命令,建议写一个 Shell 脚本(例如 renew_cert.sh)来封装逻辑:
#!/bin/bash
# 1. 导入阿里云 API 密钥 (在这里填入你刚才保存的 AccessKey)
export ALICLOUD_ACCESS_KEY="你的AccessKeyID"
export ALICLOUD_SECRET_KEY="你的AccessKeySecret"
# 2. 定义变量
LEGO_BIN="/usr/local/bin/lego"
CERT_PATH="/data/cert/.lego" # 证书存放路径
EMAIL="your_email@example.com" # 你的邮箱,用于接收 Let's Encrypt 到期提醒
DOMAIN="example.com" # 你的主域名
# 3. 执行续期命令
# --days 30 表示如果证书有效期小于30天,则执行更新;否则跳过。
# --renew-hook 表示更新成功后执行的命令,比如重载 Nginx 使新证书生效。
$LEGO_BIN --email="$EMAIL" \
--dns alidns \
--domains="*.${DOMAIN}" \
--domains="${DOMAIN}" \
--path="${CERT_PATH}" \
renew --days 30 --renew-hook "systemctl reload nginx"💡 避坑提示:如果是第一次运行,需要将脚本里的 renew --days 30换成 run,用于初始申请证书。之后再把 run改回 renew --days 30即可。
给脚本赋予执行权限:
chmod +x /data/cert/renew_cert.sh第四步:配置Nginx
renew_cert.sh执行完成之后,在 /data/cert/.lego目录下可以看到的这 4 个文件,正是 Lego 成功为你申请到的 SSL 证书及配套文件。下面为你拆解这 4 个文件的作用,并教你如何配置到 Web 服务器中开启 HTTPS。
1. 证书文件全解析
这四个文件的具体分工如下:
domain.com.key:这是你的证书私钥(Private Key)。极其重要,不可泄露。在配置 HTTPS 时,服务器需要用这个文件来解密客户端发来的数据。domain.com.crt:这是你的域名证书(Certificate)。它证明了*.domain.com这个域名确实属于你,并且包含了你的公钥。domain.com.issuer.crt:这是颁发机构的证书(Issuer/CA Certificate)。由于浏览器通常不认识直接签发的证书,它需要这个文件来证明你的证书是由受信任的机构(Let's Encrypt)颁发的。domain.com.json:这是 Lego 存储的元数据文件(里面记录了域名、邮箱、过期时间等),供 Lego 自己下次自动续期时读取,配置服务器时用不到它。
2. 配置Nginx
打开你的 Nginx 站点配置文件(通常在 /etc/nginx/conf.d/或 /etc/nginx/sites-enabled/目录下),在 server块中添加或修改以下内容:
server {
listen 443 ssl http2;
server_name domain.com *.domain.com; # 你的域名
# 指定刚才准备好的完整证书链和私钥路径
ssl_certificate /data/cert/.lego/domain.com.crt;
ssl_certificate_key /data/cert/.lego/domain.com.key;
# (可选但推荐) 强化 SSL 安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# 你的其他配置(根目录、反向代理等)放在这里...
# root /var/www/html;
# index index.html index.htm;
}第五步:设置 Crontab 定时任务(实现每月自动更新)
Let's Encrypt 签发的免费 SSL 证书有效期为 90 天。为了保证网站永远不掉线,我们需要设置一个定时任务,比如每天或每个月检查一次证书状态,并在需要时自动续签。
打开定时任务编辑器:
crontab -e在文件末尾添加以下规则(例如设定在每月1号的0点 执行):
# Lego SSL 证书自动续期脚本
0 0 1 * * /data/cert/renew_cert.sh >> /var/log/lego_renew.log 2>&1(注:为了避免所有用户都在同一时刻向 Let's Encrypt 发起请求造成拥堵,建议把分钟数设为一个随机值,比如 15(15 0 1 * *))
总结
至此,我们的阿里云服务器就已经拥有了一个全自动的 SSL 证书管理系统了。
每月自动巡检:Cron 任务每天都会唤醒 Lego。
智能判断:如果发现证书有效期大于 30 天,Lego 拍拍屁股走人;如果小于 30 天,Lego 就会自动联系阿里云 DNS 完成验证、签发新证书,并顺手帮你重载 Nginx。
省心省力:整个过程完全无人值守,一劳永逸。