腾讯云(OpenCloudOS 9)利用acme.sh获取免费的泛域名SSL证书
1. 前言
1.1. acme.sh是什么?
acme.sh是一个利用ZeroSSL 和 Let's Encrypt等受信任证书颁发机构(CA)自动化提供免费 SSL/TLS 证书的工具,可以用来部署 HTTPS,比certbot还要好用。
1.2. 泛域名SSL整数是什么?
单域名SSL证书只能对指定的域名部署HTTPS,比如你对域名example.com部署了单域名SSL证书,test.example.com还得再申请一个新的单域名SSL证书来部署HTTPS。
泛域名证书可以对*.example.com的所有子域名提供部署HTTPS,只需要一个SSL证书就可覆盖所有example.com下的子域名,如:test.example.com、abc.example.com等。
1.3. 环境介绍
正常来说可以在任何主流操作系统中使用,以下教程示例是在腾讯云(OpenCloudOS 9)环境中进行。
2. 安装cron和socat
这两个应用是acme.sh依赖的,如果没有的话安装acme.sh时会警告。
yum update && yum install socat -y
3. 下载acme.sh
① 命令方式下载:
最方便的方式是使用以下命令安装
curl https://get.acme.sh | sh
但该方式使用的源是Github,没有科学上网可能会导致无法下载,可以通过访问国内的Gitee下载。
② 国内源Gitee手动下载:
Gitee地址:https://gitee.com/neilpang/acme.sh
使用Git克隆仓库文件到本地,或直接下载zip到本地后上传到你的服务器,反正最终的效果就是你要把这个仓库里的每一个文件都要弄到你的服务器中去。
4. 重新加载环境变量
重新加载环境变量(或重新登录),不重新加载的话无法使用acme.sh命令。
下面的命令只需要执行其一即可,根据自己的情况:
source ~/.bashrc # 适用于 bash source ~/.zshrc # 适用于 zsh
5. 切换默认CA为Let's Encrypt
acme.sh --set-default-ca --server letsencrypt
6. 设置DNS API配置到环境变量
根据不同的DNS服务商有不同的环境变量配置要求,acme.sh 目前支持超过一百家的 DNS API,访问以下链接可以查看你的域名托管服务商的相关配置:
https://github.com/acmesh-official/acme.sh/wiki/dnsapi2
这里以腾讯云和华为云举两个例子:
腾讯云,需要依次执行以下命令
export Tencent_SecretId="<Your SecretId>" export Tencent_SecretKey="<Your SecretKey>"
登录腾讯云控制台,进入访问管理页面,进入访问密钥菜单栏下的API密钥管理可新建密钥,将对应的SecretId和SecretKey替换到上面命令中。
7. 生成SSL证书
这里以example.com为例生成SSL证书,这里生成的是泛域名证书,但必须同时有example.com和*.example.com。并且example.com必须在前,否则你会发现即使签发成功了也没有任何文件输出。
./acme.sh --issue --dns dns_huaweicloud -d example.com -d *.example.com -k ec-256
8. 手动配置证书
生成SSL证书后在/root/.acme.sh/你的域名_ecc/目录下可以看到证书等文件。
将其中的证书、私钥复制到你Nginx配置证书的目录下,下面是复制命令示例:
cp fullchain.cer /docker/nginx/work/crt/ cp 域名.key /docker/nginx/work/crt/
9. 自动化部署证书
执行以下命令自动化部署证书:
acme.sh --install-cert -d "example.com" --ecc \ --cert-file /docker/nginx/work/crt/cert.pem \ --key-file /docker/nginx/work/crt/key.pem \ --fullchain-file /docker/nginx/work/crt/fullchain.pem \ --reloadcmd "nginx -t && nginx -s reload"
10. 查看自动化续期证书
crontab -l
正常结果显示应该是如下所示:
28 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null