使用Lego生成ssl证书

使用Lego生成ssl证书

Lego​ 是一款用 Go 语言编写的轻量级 ACME 客户端,它原生支持阿里云 DNS(alidns)、腾讯云DNS(tencentcloud)等众多DNS提供商的插件。

下面以阿里云为例,使用Lego并结合阿里云 DNS 的 API 接口, 可以实现通配符 SSL 证书的自动申请、签发以及定时续期的功能。

第一步:准备阿里云 API 密钥(关键)

为了让 Lego 能够自动在你的阿里云 DNS 上添加 TXT 验证记录,需要给它授权。

  1. 登录阿里云控制台,进入 访问控制 (RAM)

  2. 创建一个新的 RAM 用户(比如命名为 lego-dns),访问方式勾选 OpenAPI 调用访问

  3. 为该用户添加权限:直接赋予 AliyunDNSFullAccess(管理云解析 DNS 的权限)即可。

  4. 创建完成后,保存好生成的 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 证书管理系统了。

  1. 每月自动巡检:Cron 任务每天都会唤醒 Lego。

  2. 智能判断:如果发现证书有效期大于 30 天,Lego 拍拍屁股走人;如果小于 30 天,Lego 就会自动联系阿里云 DNS 完成验证、签发新证书,并顺手帮你重载 Nginx。

  3. 省心省力:整个过程完全无人值守,一劳永逸。

怎么判断垃圾回收器类型 和 大对象阈值 2026-05-20

评论区