Alibaba Cloud Linux 3 配置免费 HTTPS 证书:Certbot 与 acme.sh

2026.04.09
苦温集 · 运维记录 Alibaba Cloud Linux 3 · Nginx · Certbot · acme.sh · HTTPS

适用场景:在Alibaba Cloud Linux 3操作系统环境下,已经本地安装Nginx。

本文主要记录两种比较常用的做法:

  • 站点已经能从 80 端口正常访问,想偷懒省事儿,用 Certbot
  • 不想开 80 端口,或者想签通配符证书,又或者不想让工具去改 Nginx 配置,那就用 acme.sh + 阿里云 DNS API

开始前的准备工作:

  • 域名已经解析到服务器公网 IP。
  • 防火墙已经放行 80443
  • Nginx 已经装好,而且能正常启动。
  • 如果准备走 certbot --nginx,那这个域名对应的 HTTP 站点最好已经能打开。

方案一:Certbot

这个方式适合场景简单或者手残党(我)、偷懒党(也是我),可以一句话搞定,且支持自动续期。

1. 安装 Certbot 和 Nginx 插件

sudo dnf install -y epel-release
sudo dnf install -y certbot python3-certbot-nginx

2. 申请证书并自动配置 Nginx

把域名换成你自己的:

sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

运行过程中一般会抛出几个问题:

  1. 输入邮箱,用来接收证书到期提醒。
  2. 同意服务条款,输入 Y
  3. 是否把 HTTP 自动跳转到 HTTPS,建议选择 2,也就是 Redirect

运行成功后,Certbot 会顺手把 Nginx 也重载掉。正常的话,这时候再访问 https://yourdomain.com 就已经能用了。

3. 验证自动续期

sudo certbot renew --dry-run

如果最后看到类似 all simulated renewals succeeded 的提示,基本就说明自动续期这块没问题了。

方案二:acme.sh + 阿里云 DNS API

这个方法博主并未亲手测试过,要是过程中遇到了啥问题的话…🥹求轻点儿骂…

这个方法比上面那个略显复杂一点点。比如不想让 Certbot 动 Nginx 配置,那就得用这个方法了。

1. 安装 acme.sh

把邮箱替换成你自己的:

curl https://get.acme.sh | sh -s email=my@example.com
source ~/.bashrc

2. 准备阿里云 RAM 子账号

这一步我还是建议老老实实建个 RAM 子账号,别直接上主账号密钥。

  1. 登录阿里云控制台,进入 RAM 访问控制
  2. 新建一个用户,并勾选 OpenAPI 调用访问
  3. 记录它的 AccessKey IDAccessKey Secret
  4. 给它授予 AliyunDNSFullAccess 权限。

3. 配置环境变量

export Ali_Key="你的AccessKey_ID"
export Ali_Secret="你的AccessKey_Secret"

4. 申请证书

如果你要同时签根域名和通配符:

~/.acme.sh/acme.sh --issue --dns dns_ali -d yourdomain.com -d *.yourdomain.com

这个过程不吃 80 端口,也不用停 Nginx。看到 Cert success,基本就说明签发成功了。

5. 安装证书到 Nginx 目录

先准备目录:

sudo mkdir -p /etc/nginx/ssl/yourdomain.com

然后把证书安装到 Nginx 实际读取的目录:

~/.acme.sh/acme.sh --install-cert -d yourdomain.com -d *.yourdomain.com \
  --key-file       /etc/nginx/ssl/yourdomain.com/key.pem \
  --fullchain-file /etc/nginx/ssl/yourdomain.com/cert.pem \
  --reloadcmd      "systemctl reload nginx"

这里的 --reloadcmd 很重要。后面证书续期成功后,它会自动帮你重载 Nginx。

6. 手动调整 Nginx 配置

下面放一份一般比较常用的配置方式:

server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name yourdomain.com www.yourdomain.com;

    ssl_certificate     /etc/nginx/ssl/yourdomain.com/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/yourdomain.com/key.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;

    root /usr/share/nginx/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

改完以后先测一下配置,再重载:

sudo nginx -t
sudo systemctl reload nginx

7. 检查 acme.sh 的自动续期

crontab -l

如果安装正常,这里一般能看到一条 acme.sh 的定时任务。想手动跑一次,也可以这样:

~/.acme.sh/acme.sh --renew -d yourdomain.com -d *.yourdomain.com --force

常见问题

1. certbot --nginx 会不会自己找到本机的 Nginx?

会,但前提挺明确。

它不只是看“这台机器上有没有 Nginx”,更关键的是:Nginx 配置里有没有和你域名对应上的 server 块。

在执行下面这条命令之前:

sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

Nginx 里最好已经有一段能用的 HTTP 配置,比如:

server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;

    root /usr/share/nginx/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

如果没有,Certbot 多半会报:Could not automatically find a matching server block

2. 续期失败

Certbot 排查

Certbot 日志:

sudo tail -n 50 /var/log/letsencrypt/letsencrypt.log

如果怀疑是自动任务故障,再看一下系统里的 timer:

systemctl list-timers | grep certbot

如果用 systemd 托管,还可以看最近的服务日志:

sudo journalctl -u certbot.service -n 50 --no-pager

如果想手动触发一次,把输出直接打到终端里:

sudo certbot renew --dry-run

acme.sh 排查

acme.sh 这边,先确认 cron 任务还在不在:

crontab -l

然后直接手动续期,把调试信息一并打印出来:

~/.acme.sh/acme.sh --renew -d yourdomain.com -d *.yourdomain.com --debug 2

日志文件:

tail -n 50 ~/.acme.sh/acme.sh.log

这套里最容易踩的点,基本是下面这几个:

  • Ali_KeyAli_Secret 没有生效。
  • RAM 子账号权限不够,没法新增或删除 _acme-challenge 记录。
  • DNS 记录更新了,但还没来得及生效。
  • 证书续期成功了,但 --reloadcmd 执行失败,导致 Nginx 没重新加载新证书。

如果怀疑卡在 Nginx 这一步,也单独查一下:

sudo nginx -t
sudo systemctl status nginx --no-pager

说白了就是两步:先确认续期命令执行结果,再确认 Nginx 配置是否生效。 这样查起来会清楚很多。