使用 acme.sh 自动申请并更新泛域名证书

在互联网快速发展的今天,网站安全愈发重要,而 SSL/TLS 证书成为了保护网站数据的基础。对于管理多个子域的用户来说,泛域名证书(Wildcard Certificate)是一种高效便捷的选择。

各家云厂商也开始割起来了域名证书的韭菜,泛域名证书收费昂贵,单域名证书免费但将有效期都调整为了三个月。

我之前也是宁愿花费一些小钱来解决这个问题,一年更新一次也不是不行,现在调制为三个月后就需要频繁更新了,正好之前的服务器过期,迁移之后顺便研究起来了证书部署的问题,于是有了这篇文章。

什么是 acme.sh?

ACME(自动证书管理环境)是一个互联网工程任务组维护的协议,它允许自动化 Web 服务器证书的部署,acme.sh 是支持 ACME 协议流行的客户端之一,可以通过其实现 SSL 证书的自动申请、续期等。

安装

在使用 acme.sh 前,需要先在服务器上安装它。acme.sh 的安装过程简单,只需执行几条命令即可。

curl https://get.acme.sh | sh -s [email protected]

[email protected]更换为自己的邮箱后执行,安装主要把 acme.sh 安装到你的 home 目录下,并且添加了一个 crontab 用于自动检测所有的证书,如果快过期了,需要更新,则会自动更新证书。

注册 ZeroSSL 账号

acme.sh 目前默认使用ZeroSSL.com,ZeroSSL 没有速率限制,可以颁发无限制、有效期为 90 天的 TLS/SSL 证书。

  1. 先去创建一个 ZeroSSL 账号

  2. 访问 https://app.zerossl.com/developer 生成你的 EAB 凭证,点击EAB Credentials for ACME Clients

  3. 执行命令,注册你的 EAB 凭证,将 xxxxxxxxx 替换为第二步获取到的内容

acme.sh --register-account --server zerossl \
        --eab-kid xxxxxxxxx  \
        --eab-hmac-key xxxxxxxxx

申请签发泛域名证书

我选择直接使用 DNS API 模式进行签发,还支持其他模式可以自己研究,我的域名都在腾讯云,所以通过 DNSPod 可以管理。

登录 DNSPod 控制台获取到 DNSPod Token:https://console.dnspod.cn/account/token/token

获取后将值存入到系统环境变量中:

vim ~/.bashrc

#写入
export DP_Id=
export DP_Key=

#保存后执行
source ~/.bashrc

保存后就可以开始申请了:

acme.sh --issue --dns dns_dp -d example.com -d *.example.com

运行后,acme.sh 将自动为example.com域名申请泛域名证书,如果没有出错,会将证书文件保存在~/.acme.sh/example.com/目录下,并且会自动为该域名创建配置,以便自动执行续期任务。

安装证书

acme.sh 不建议直接使用~/.acme.sh/目录下的证书文件,而是通过 acme.sh 提供的命令将证书安装到指定位置,以确保证书的正确使用和续期。

acme.sh --install-cert -d example.com \
        --key-file       /path/to/keyfile/in/nginx/key.pem  \
        --fullchain-file /path/to/fullchain/nginx/cert.pem \
        --reloadcmd     "service nginx force-reload"

将路径设置为自己的路径即可,在reloadcmd中执行重启 Nginx 的命令,到这一步本机的证书已经是没问题了,但是如果使用了 CDN 等服务的话,仍然需要更新对应服务的证书配置。

acme.sh 提供了阿里云 CDN 的脚本,没有腾讯云的,所以我自己顺手写了一个小工具。

Cert Manager

将本地通过 acme.sh 生成的证书上传到对应云服务的证书服务中,以便于在云服务中使用证书。

composer create-project sy-records/cert-manager
cd cert-manager
chmod +x tx-cert-manger

调用了腾讯云的获取证书列表和一键更新旧证书资源两个接口,可以直接更新对应的资源使用的证书,支持 clb、cdn、waf、live、ddos、teo、apigateway、vod、tke、tcb、tse、cos。

使用 composer 安装后,获取腾讯云的 SecretId 和 SecretKey,也放到环境变量中:

vim ~/.bashrc

#写入
export TX_SECRET_ID=
export TX_SECRET_KEY=

#保存后执行
source ~/.bashrc

config.example.php复制一份到config.php,并根据实际情况修改配置:

return [
    'example.com' => [
        'resourceTypes' => ['cdn'],
        'fullchain' => '/path/to/fullchain/nginx/cert.pem',
        'privkey' => '/path/to/keyfile/in/nginx/key.pem',
    ]
];

这样就可以使用tx-cert-manger命令来更新腾讯云的服务了。

# 更新所有配置文件中的证书
./tx-cert-manger

# 更新指定域名的证书
./tx-cert-manger example.com

配合 reloadcmd,就可以实现续期后自动更新证书文件到腾讯云,并重启本地的 Nginx 服务了。

acme.sh --install-cert -d example.com \
        --key-file       /path/to/keyfile/in/nginx/key.pem  \
        --fullchain-file /path/to/fullchain/nginx/cert.pem \
        --reloadcmd     "service nginx force-reload & /path/to/cert-manager/tx-cert-manger example.com"

acme.sh 是一个功能强大、配置灵活的 ACME 客户端,特别适合需要管理多个域名和子域名的用户。

通过 acme.sh,不仅可以快速申请泛域名证书,还能轻松实现自动更新,降低了 SSL 证书管理的复杂度。

如果你的站点涉及多个子域名,那么使用 acme.sh 申请泛域名证书是一个不错的选择。

3 条评论

发表评论

*