acme.sh 签发 SSL 证书
安装 acme.sh
acme.sh 是一个集成了 ACME 客户端协议的 Bash 脚本,作者是 @neilpangxa,按照官方文档说明,我们直接在 Linux 下安装。
curl https://get.acme.sh | sh -s email=username@example.com
如果是国内的机器,可以使用拖回源码直接安装:
git clone --depth 1 https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install -m username@example.com
请注意替换 username@example.com 为你自己的邮箱,避免无法收到上游证书的邮件通知,比如 Let's Encrypt 偶尔会错发证书,然后就会邮件通知你,这时候就需要重新签发一次证书了。
安装完成后重新加载 Bash:
source ~/.bashrc
然后也可以开启自动更新:
acme.sh --upgrade --auto-upgrade
选择默认 CA
目前 acme.sh 支持 5 个正式环境 CA,分别是 Let's Encrypt、Buypass、ZeroSSL、SSL.com 和 Google Public CA,默认使用 ZeroSSL,如果需要更换可以使用如下命令:
切换 Let's Encrypt
acme.sh --set-default-ca --server letsencrypt
切换 Buypass
acme.sh --set-default-ca --server buypass
切换 ZeroSSL
acme.sh --set-default-ca --server zerossl
切换 SSL.com
acme.sh --set-default-ca --server ssl.com
切换 Google Public CA
acme.sh --set-default-ca --server google
如果已有 ZeroSSL 帐号,可以在后台控制面板拿到 API Key,然后执行如下命令
apt install jq
curl -s -X POST "https://api.zerossl.com/acme/eab-credentials?access_key=你的API_Key" | jq
终端会输出如下内容
{
"success": true,
"eab_kid": "kid字符串",
"eab_hmac_key": "hmac_key字符串",
}
然后手工添加帐号
acme.sh --register-account --server zerossl \
--eab-kid kid字符串 \
--eab-hmac-key hmac_key字符串
Google Public CA 需要按照官方博客申请内测,然后获取 Key。
几个 CA 的简单对比
| 功能 | LE | Buypass | ZeroSSL | SSL.com | Google Public CA |
|---|---|---|---|---|---|
| 有效期 | 90 天 | 180 天 | 90 天 | 90 天 | 90 天 |
| 多域名 | 支持 | 支持,最多 5 个 | 支持 | 收费支持 | 支持 |
| 泛域名 | 支持 | 不支持 | 支持 | 收费支持 | 支持 |
| Rate Limit | 有 | 有 | 收费无 | 未知 | 有 |
| GUI 管理 | 否 | 否 | 有 | 有 | 无 |
| ECC 证书链 | 否 | 否 | 有 | 未知 | 无 |
| 客户支持 | 社区 | 收费 | 收费 | 收费 | 收费 |
使用 HTTP 验证签发证书
首先我们要做一下准备工作,假设你域名是 example.com,解析到你的服务器让其生效后,我们建立一个目录:
mkdir -p /var/www/letsencrypt
我们的目的是绑定 http://example.com/.well-known/acme-challenge 到这个目录。
如果用的 Nginx,那么新建一个配置文件:
server {
listen 80;
listen [::]:80;
server_name example.com;
location /.well-known/acme-challenge {
root /var/www/letsencrypt;
}
location / {
rewrite ^/(.*)$ https://$host/$1 permanent;
}
}
我们以 Let's Encrypt 为例,直接在终端运行
acme.sh --issue -d example.com -w /var/www/letsencrypt
如果希望签发 ECC 证书,则运行
acme.sh --issue -d example.com --keylength ec-256 -w /var/www/letsencrypt
如果需要多个域名,则运行
acme.sh --issue -d example.com -d example.org -w /var/www/letsencrypt
然后就等他执行完,直到出现 Cert success 的提示
使用 DNS 验证签发证书
通过 Aliyun API方式
export Ali_Key="<YOU_KEY>"
export Ali_Secret="<YOU_SECRET>"
签发
acme.sh --issue --dns dns_ali -d example.com -d *.example.com
安装证书
acme.sh --install-cert -d example.com \
--key-file /etc/nginx/ssl/example.com.key \
--fullchain-file /etc/nginx/ssl/example.com.crt \
--ca-file /etc/nginx/ssl/example.com.ca.crt \
--reloadcmd "systemctl restart nginx"
对应的 Nginx 配置指定证书文件
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_trusted_certificate /etc/nginx/ssl/example.com.ca.crt;
如果是 ECC 证书,则安装的时候需要带上 --ecc 参数,比如
acme.sh --install-cert --ecc -d example.com \
--key-file /etc/nginx/ssl/example.com.key \
--fullchain-file /etc/nginx/ssl/example.com.crt \
--ca-file /etc/nginx/ssl/example.com.ca.crt \
--reloadcmd "systemctl restart nginx"
注意如果是多个域名,也仅需要在 -d 参数后面指定第一个域名即可。
查看已经生成的证书:
acme.sh --list
更新acme.sh
手动更新:
acme.sh --upgrade
开启自动更新:
acme.sh --upgrade --auto-upgrade
关闭自动更新:
acme.sh --upgrade --auto-upgrade 0
查看acme.sh报错
如果运行acme.sh出错,可开启debug或者log。
查看debug:
acme.sh --issue ..... --debug
查看error:
acme.sh --issue ..... --debug 2
生成日志:
acme.sh --issue ..... --log
日志文件路径为:
~/.acme.sh/acme.sh.log