在互联网快速发展的今天,网站安全愈发重要,而 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 证书。
-
先去创建一个 ZeroSSL 账号
-
访问 https://app.zerossl.com/developer 生成你的 EAB 凭证,点击
EAB Credentials for ACME Clients
-
执行命令,注册你的 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 申请泛域名证书是一个不错的选择。
小白直接看迷糊了
@晓庄 我不信你是小白
点个赞,还要五个字