Alibaba Cloud Linux 3 配置免费 HTTPS 证书:Certbot 与 acme.sh
适用场景:在Alibaba Cloud Linux 3操作系统环境下,已经本地安装Nginx。
本文主要记录两种比较常用的做法:
- 站点已经能从
80端口正常访问,想偷懒省事儿,用Certbot。 - 不想开
80端口,或者想签通配符证书,又或者不想让工具去改 Nginx 配置,那就用acme.sh + 阿里云 DNS API。
开始前的准备工作:
- 域名已经解析到服务器公网 IP。
- 防火墙已经放行
80和443。 - 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
运行过程中一般会抛出几个问题:
- 输入邮箱,用来接收证书到期提醒。
- 同意服务条款,输入
Y。 - 是否把 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 子账号,别直接上主账号密钥。
- 登录阿里云控制台,进入 RAM 访问控制。
- 新建一个用户,并勾选 OpenAPI 调用访问。
- 记录它的
AccessKey ID和AccessKey Secret。 - 给它授予
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_Key和Ali_Secret没有生效。- RAM 子账号权限不够,没法新增或删除
_acme-challenge记录。 - DNS 记录更新了,但还没来得及生效。
- 证书续期成功了,但
--reloadcmd执行失败,导致 Nginx 没重新加载新证书。
如果怀疑卡在 Nginx 这一步,也单独查一下:
sudo nginx -t
sudo systemctl status nginx --no-pager
说白了就是两步:先确认续期命令执行结果,再确认 Nginx 配置是否生效。 这样查起来会清楚很多。