Ubuntu + Docker Nginx 配置 Let‘s Encrypt 免费 HTTPS 证书及自动续期
前言现在的网站和 API 服务基本都需要 HTTPS 支持。相比以前购买 SSL 证书Let’s Encrypt 提供了免费的 DVDomain Validation证书并且支持自动续期非常适合个人项目、小型服务以及中小企业应用。根据我项目的特点采用通配符证书Wildcard Certificate DNS-01 验证的方式。通配符证书 *.waisaa.com 覆盖所有子域名加新项目无需重签。通配符必须用 DNS-01 验证acme.sh 阿里云 DNS API。本文记录一种比较常见的生产部署方案Ubuntu 服务器Nginx 使用 Docker 部署Certbot 使用宿主机安装Let’s Encrypt 免费证书Webroot 方式验证域名自动续期并自动 Reload Nginx这种架构简单稳定适合个人服务器SaaS 项目前后端分离应用API 服务多域名部署最终实现Internet │ ▼ Lets Encrypt │ │ DNS-01 ▼ acme.sh │ │ 调用 ▼ 阿里云 DNS API │ ▼ 自动添加 TXT │ ▼ 验证成功 │ ▼ /etc/letsencrypt/ │ ▼ Docker Nginx一、安装 acme.shcurl https://get.acme.sh | sh -s emailwaisaaqq.com或重新登录使别名生效source ~/.bashrc安装到~/.acme.sh/自动创建 cron 任务crontab -l 可见默认 CA 是 ZeroSSL可切回 Let’s Encrypt见下方说明验证acme.sh --version二、阿里云创建 RAM 子账号登录 RAM 控制台 1.身份管理 → 用户 → 创建用户登录名acme-dns访问方式勾选「使用永久 AccessKey 访问」创建后立即保存AccessKey ID和AccessKey Secret只显示一次2.授权选中该用户 → 添加权限 → 搜索并勾选AliyunDNSFullAccess不要用主账号 AccessKey泄露风险高。三、配置阿里云 DNS 凭证acme.sh 的 dns_ali 插件读取环境变量export Ali_Key你的AccessKeyID export Ali_Secret你的AccessKeySecret重要这两条只在当前 shell 生效。申请证书时 acme.sh 会自动把凭证保存到~/.acme.sh/account.conf后续续期不需要再 export。所以只需在首次申请命令前执行一次即可。首次申请后检查~/.acme.sh/account.conf里是否有SAVED_Ali_Key和SAVED_Ali_Secret确认已持久化。四、申请通配符证书DNS-01acme.sh --issue \ --dns dns_ali \ -d waisaa.com \ -d *.waisaa.com \ --keylength ec-256--dns dns_ali用阿里云 DNS API 自动加/删 TXT 记录全自动*.waisaa.com必须用引号包裹防止 shell 展开--keylength ec-256ECC 证书比 RSA 更小更快nginx 完全支持过程acme.sh 调阿里云 API 加 TXT → 等 DNS 传播默认 120s→ 验证 → 删 TXT成功后证书在 ~/.acme.sh/waisaa.com_ecc/。关于 CAacme.sh 默认 ZeroSSL首次运行会自动注册账号。若想用 Let’s Encryptacme.sh --set-default-ca --server letsencrypt两者都免费ZeroSSL 支持泛域名Let’s Encrypt 也支持任选其一。建议保持默认 ZeroSSL 即可。五、安装证书到 nginx 引用路径我的当前 nginx 配置和 docker 挂载都指向/etc/letsencrypt/live/waisaa.com/用--install-cert复制过去配置零改动# 先创建目录 mkdir -p /etc/letsencrypt/live/waisaa.com acme.sh --install-cert -d waisaa.com --ecc \ --key-file /etc/letsencrypt/live/waisaa.com/privkey.pem \ --fullchain-file /etc/letsencrypt/live/waisaa.com/fullchain.pem \ --reloadcmd docker exec nginx nginx -s reload参数说明–ecc 对应第 4 步的 ec-256必须带–reloadcmd续期后自动 reload nginx 容器容器名 nginx 来自 docker-compose.yml:5acme.sh 会把 install-cert 配置记录下来后续续期自动执行复制 reload无需手动干预验证文件就位# 应有 fullchain.pem 和 privkey.pem ls -l /etc/letsencrypt/live/waisaa.com/# 查看证书的关键信息不做任何修改 openssl x509 -in /etc/letsencrypt/live/waisaa.com/fullchain.pem -noout -subject -dates六、配置 Nginx HTTPS修改 Nginxserver { listen 443 ssl; server_name example.com; ssl_certificate /etc/letsencrypt/live/waisaa.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/waisaa.com/privkey.pem; location / { root /usr/share/nginx/html; } }HTTP 自动跳转 HTTPSserver { listen 80; server_name example.com; return 301 https://$host$request_uri; }重启 Nginxdocker restart nginx测试curl -I https://example.com如果返回HTTP/2 200说明 HTTPS 配置成功。七、启动 nginxcd /srv/waisaa/infra/nginx docker compose up -d # 检查 docker logs nginx --tail 20 curl -I https://tally.waisaa.com/八、验证自动续期acme.sh 安装时已自动配好 croncrontab -l 可见每天 00:00 检查。手动模拟一次续期acme.sh --renew -d waisaa.com --ecc --force成功输出 Cert success! 即表示续期 复制 reload 链路完整。acme.sh 默认在证书到期前 30 天自动续期ECC 通配符证书有效期 90 天。