acme.sh 签发 SSL 证书
acme.sh 签发 SSL 证书安装 acme.shacme.sh 是一个集成了 ACME 客户端协议的 Bas...
扫描右侧二维码阅读全文
19
2021/11

acme.sh 签发 SSL 证书

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 的简单对比

功能LEBuypassZeroSSLSSL.comGoogle 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
Last modification:December 30th, 2024 at 10:06 am
If you think my article is useful to you, please feel free to appreciate

Leave a Comment