因为阿里云的免费证书只有三个月的有效期,每次更换都比较繁琐,所以找到了 acme.sh
,还有一种 certbot
我没有去了解,就直接使用了 acme.sh
来更新证书,acme.sh
的主要特点就是:
- 支持多种 DNS 服务商
- 自动化续期
- 直接指定证书路径
足以解决证书有效期问题。
1. 安装 acme.sh
如果尚未安装 acme.sh,切换到常用安装目录下通过以下命令安装,并加载环境变量和系统配置::
curl https://get.acme.sh | sh -s email=your_email@example.com
source ~/.bashrc
其他安装方式:
git clone https://gitee.com/neilpang/acme.sh.git
cd acme.sh
./acme.sh --install -m your_email@example.com
source ~/.bashrc
2. 获取阿里云 DNS API 密钥
登录阿里云控制台,进入 RAM 访问控制
,创建一个具有 DNS
管理权限的子用户,并获取其 AccessKey ID
和 AccessKey Secret
。
可参考 创建RAM用户 帮助文档查看详细规则。
创建用户账号后分配权限,选择 AliyunDNSFullAccess
为一个子用户授予完全管理云解析DNS 的权限。分配完成后会列表中会有复制按钮,需要保存你的 AccessKey ID
和 AccessKey Secret
,之后无法获取。
详细步骤参考 子用户权限管理 帮助文档。
3. 配置阿里云 DNS
上一步获取到的 AccessKey ID
和 AccessKey Secret
API 秘钥,配置到 acme.sh
中:
vim acme.sh
export Ali_Key="your_aliyun_access_key"
export Ali_Secret="your_aliyun_access_secret"
4. 申请 SSL 证书并自动续期
申请证书
acme.sh --issue --dns dns_ali -d example.com
创建证书存放目录
mkdir -p /etc/nginx/cert/example.com
安装证书并设置自动更新
acme.sh --install-cert -d example.com \
--certpath /etc/nginx/cert/example.com/cert.pem \
--keypath /etc/nginx/cert/example.com/privkey.pem \
--fullchainpath /etc/nginx/cert/example.com/fullchain.pem \
--reloadcmd "systemctl reload nginx"
检查自动续期配置
crontab -l
acme
自动设置定时任务,定期检查并更新证书,无需手动操作。
5. 域名解析到当前服务器并修改nginx配置文件
阿里云域名解析到当前服务器:
server
{
listen 80;
server_name example.com;
rewrite ^(.*) https://$host$1 permanent;
}
server {
listen 443 ssl;
server_name example.com;
root /root/example.com/public_html/public;
index index.php index.html index.htm;
ssl_certificate /etc/nginx/cert/example.com/fullchain.pem;
ssl_certificate_key /etc/nginx/cert/example.com/privkey.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
...
}
6. acme常用命令
查看证书列表:
acme.sh --list
或
"/root/.acme.sh"/acme.sh --list
查看证书信息:
acme.sh --info -d example.com
手动续期证书:
acme.sh --renew -d example.com
删除证书
acme.sh --remove -d example.com
7. 注意事项
- 证书默认有效期为 90 天,
acme.sh
会自动续期。 - 如果使用其他 DNS 服务商,需调整相应的 API 配置。
- 更多详细配置参考官方文档:
过程中遇到的问题
openssl 版本过低。