现在免费的SSL证书只有三个月有效期,有一个博客和图床都用的ssl证书到期需要重新签发,挺麻烦的。原本想着写个脚本通过阿里云的 OpenAPI 进行证书的签发和部署,但是偶然发现了 ACME 这个项目,研究了下,这个项目用起来挺简单的,不自己写了,就用这个吧。
第一章 项目简介
ACME的全称是Automatic Certificate Management Environment(自动化证书管理环境)。它是一个协议,用于自动化数字证书的申请、验证和续期过程,尤其是针对SSL/TLS证书。ACME协议的出现,使得SSL/TLS证书的管理变得更加简便,特别是在免费的证书颁发机构(如Let’s Encrypt)的支持下,简化了证书的自动化流程。
接下来介绍的项目ACME 是一个用 Shell 脚本编写的客户端工具,用于与 ACME 服务器(如 Let’s Encrypt 或其他支持 ACME 协议的证书颁发机构)交互,自动化地申请、管理和续期 SSL/TLS 证书。相较于 Let’s Encrypt 等CA机构的原生工具,acme.sh 实现了更过的功能,并且简化了证书申请、部署流程。
acme.sh支持的CA机构:
- ZeroSSL.com CA(default)
- Letsencrypt.org CA
- BuyPass.com CA
- SSL.com CA
- Google.com Public CA
- Pebble strict Mode
- Any other RFC8555-compliant CA
现在的免费证书有效期是90天,acme.sh
自动创建 cronjob, 每天 0:00 点自动检测所有的证书,如果快过期了,需要更新,则会自动更新证书。
众所周知,为确保证书请求者拥有对特定域名的管理权,防止恶意用户获取他人域名的证书。CA机构生成ssl证书时需要进行域名验证,验证方式通常为 HTTP验证 和 DNS验证。
- HTTP验证:
请求者(即证书申请者)需要在自己的网站根目录下的 .well-known/acme-challenge/ 路径下放置一个由 ACME 服务器生成的 验证文件。这个文件通常包含一些特定的内容(如一个随机生成的字符串),用于证明你对该域名的控制权。
然后,ACME 服务器 会尝试通过 HTTP 访问该路径,类似于访问 http://yourdomain.com/.well-known/acme-challenge/
- DNS验证:
在DNS验证方法中,请求者需要在自己域名的 DNS 配置中添加一个特定的 TXT 记录。这个 TXT 记录的内容通常是由 ACME 服务器生成的一个唯一的令牌(token)。而 ACME 服务器 会通过查询 DNS 来验证该记录是否存在以及记录的值与是否预期一致,如果一致则为该域名签发SSL/TLS证书。
acme.sh
支持 HTTP 和 DNS 两种验证方式。
下面介绍的是阿里云DNS的验证方式,如果你的域名解析是在其它厂商,则使用其它厂商的,支持的厂商 https://github.com/acmesh-official/acme.sh/wiki/dnsapi
因为有图床域名直接解析到了OSS,所以只能使用DNS验证,如果你的域名都是解析到了服务器,那么直接使用HTTP验证即可,DNS验证相对麻烦些。
1.2 项目部署
项目部署很简单,直接安装即可。
curl https://get.acme.sh | sh -s email=my@example.com
或者
wget -O - https://get.acme.sh | sh -s email=my@example.com
普通用户和 root 用户都可以安装使用。
安装过程自动进行了以下几步:
- 把 acme.sh 安装到你的 home 目录下:
~/.acme.sh/
并创建 一个 shell 的 alias,例如 .bashrc
,方便你的使用: alias acme.sh=~/.acme.sh/acme.sh
- 自动为你创建 cronjob, 每天的这个时候点自动检测所有的证书,如果快过期了,需要更新,则会自动更新证书。
比如:
- "/root/.acme.sh"/acme.sh:这是执行 acme.sh 脚本的路径。
- --cron:这个选项表示在 cron 定时任务中运行 acme.sh,通常用于自动续期。
- --home "/root/.acme.sh":指定 acme.sh 的安装路径或工作目录,确保它在正确的目录下运行。
然后,重新加载环境变量或者重新登录即可直接使用acme.sh
执行
. "~/.acme.sh/acme.sh.env"
或者重新登录
第二章 配置DNS验证权限
acme.sh
会使用RAM用户 连接到云厂商DNS API,自动创建 txt记录,验证完成后会在删除该 txt记录,因此需要创建的 RAM用户 需要具有DNS云解析的管理权限。
https://ram.console.aliyun.com/users/create
创建用户后保存好 AccessKey ID
和 AccessKey Secret
,然后添加云解析权限
添加权限时搜索DNS,找到 AliyunDNSFullAccess 添加即可。
第三章 进行DNS验证并申请证书
首先将创建账户时保存的 AccessKey
和 AccessKey Secret
导出为全局变量,
[root@VM-24-15-centos .acme.sh]# export Ali_Key=""
[root@VM-24-15-centos .acme.sh]# export Ali_Secret=""
或者将上面的变量直接写入 /root/.acme.sh/account.conf 配置文件中(acme.sh
运行时会加载这里面的变量)。
接下来DNS验证,如下 使用 --dns dns_ali 指定阿里云DNS API,acme.sh
会自动查询设置的 Ali_Key、Ali_Secret
-d 后面跟上要申请证书的域名。
然后,acme.sh
会连接 ACME服务器,验证DNS,如果成功则会签发 SSL证书。
acme.sh --issue --dns dns_ali -d www.hugbg.com
- --issue:表示请求签发证书。
- --dns dns_ali:表示使用 DNS 验证方法,dns_ali 是用于阿里云的 DNS API 插件,用于自动添加 TXT 记录进行验证。
- -d www.hugbg.com:指定要为 www.hugbg.com 域名签发证书。
[root@VM-24-15-centos .acme.sh]# ./acme.sh --issue --dns dns_ali -d www.hugbg.com
[Tue Feb 11 15:39:35 CST 2025] Using CA: https://acme.zerossl.com/v2/DV90
[Tue Feb 11 15:39:35 CST 2025] Account key creation OK.
[Tue Feb 11 15:39:35 CST 2025] No EAB credentials found for ZeroSSL, let's obtain them
[Tue Feb 11 15:39:37 CST 2025] Registering account: https://acme.zerossl.com/v2/DV90
[Tue Feb 11 15:39:40 CST 2025] Registered
[Tue Feb 11 15:39:40 CST 2025] ACCOUNT_THUMBPRINT='1IOCo-LGV8Cf0UGVfCP-dGcfgYvaZgtYrqKhWRAtk3I'
[Tue Feb 11 15:39:40 CST 2025] Creating domain key
[Tue Feb 11 15:39:40 CST 2025] The domain key is here: /root/.acme.sh/www.hugbg.com_ecc/www.hugbg.com.key
[Tue Feb 11 15:39:40 CST 2025] Single domain='www.hugbg.com'
[Tue Feb 11 15:39:44 CST 2025] Getting webroot for domain='www.hugbg.com'
[Tue Feb 11 15:39:44 CST 2025] Adding TXT value: vRBmdVFiRS5o2muVunuwr95lSAoix0qTm6pQUxN2nBI for domain: _acme-challenge.www.hugbg.com
[Tue Feb 11 15:39:46 CST 2025] The TXT record has been successfully added.
[Tue Feb 11 15:39:46 CST 2025] Let's check each DNS record now. Sleeping for 20 seconds first.
[Tue Feb 11 15:40:07 CST 2025] You can use '--dnssleep' to disable public dns checks.
[Tue Feb 11 15:40:07 CST 2025] See: https://github.com/acmesh-official/acme.sh/wiki/dnscheck
[Tue Feb 11 15:40:07 CST 2025] Checking www.hugbg.com for _acme-challenge.www.hugbg.com
[Tue Feb 11 15:40:08 CST 2025] Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 35
[Tue Feb 11 15:40:17 CST 2025] Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 7
[Tue Feb 11 15:40:18 CST 2025] Success for domain www.hugbg.com '_acme-challenge.www.hugbg.com'.
[Tue Feb 11 15:40:18 CST 2025] All checks succeeded
[Tue Feb 11 15:40:18 CST 2025] Verifying: www.hugbg.com
[Tue Feb 11 15:40:20 CST 2025] Processing. The CA is processing your order, please wait. (1/30)
[Tue Feb 11 15:40:24 CST 2025] Success
[Tue Feb 11 15:40:24 CST 2025] Removing DNS records.
[Tue Feb 11 15:40:24 CST 2025] Removing txt: vRBmdVFiRS5o2muVunuwr95lSAoix0qTm6pQUxN2nBI for domain: _acme-challenge.www.hugbg.com
[Tue Feb 11 15:40:26 CST 2025] Successfully removed
[Tue Feb 11 15:40:26 CST 2025] Verification finished, beginning signing.
[Tue Feb 11 15:40:26 CST 2025] Let's finalize the order.
[Tue Feb 11 15:40:26 CST 2025] Le_OrderFinalize='https://acme.zerossl.com/v2/DV90/order/68zqU4eZEA2bzImiwA1JWg/finalize'
[Tue Feb 11 15:40:28 CST 2025] Order status is 'processing', let's sleep and retry.
[Tue Feb 11 15:40:28 CST 2025] Sleeping for 15 seconds then retrying
[Tue Feb 11 15:40:44 CST 2025] Polling order status: https://acme.zerossl.com/v2/DV90/order/68zqU4eZEA2bzImiwA1JWg
[Tue Feb 11 15:40:46 CST 2025] Downloading cert.
[Tue Feb 11 15:40:46 CST 2025] Le_LinkCert='https://acme.zerossl.com/v2/DV90/cert/qVpZUFffb815HFpNSdF7Yg'
[Tue Feb 11 15:40:47 CST 2025] Cert success.
-----BEGIN CERTIFICATE-----
MIID/jCCA4OgAwIBAgIRAM0wwzuS+J4JVeinmMavdOwwCgYIKoZIzj0EAwMwSzEL
。。。。。。。。。。。
-----END CERTIFICATE-----
[Tue Feb 11 15:40:47 CST 2025] Your cert is in: /root/.acme.sh/www.hugbg.com_ecc/www.hugbg.com.cer
[Tue Feb 11 15:40:47 CST 2025] Your cert key is in: /root/.acme.sh/www.hugbg.com_ecc/www.hugbg.com.key
[Tue Feb 11 15:40:47 CST 2025] The intermediate CA cert is in: /root/.acme.sh/www.hugbg.com_ecc/ca.cer
[Tue Feb 11 15:40:47 CST 2025] And the full-chain cert is in: /root/.acme.sh/www.hugbg.com_ecc/fullchain.cer
[root@VM-24-15-centos .acme.sh]#
签发成功后,会自动保存 密钥信息,供下次自动使用。
添加的txt记录也都自动删除了
注意:
acme.sh 脚本默认 CA 服务器是 ZeroSSL
,有时可能会导致获取证书的时候一直出现:Pending,The CA is processing your order,please just wait.
只需要把 CA 服务器改成 Let's Encrypt
即可,虽然更改以后还是有概率出现 pending,但基本 2-3 次即可成功
acme.sh --set-default-ca --server letsencrypt
更高级的用法请参考: https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert
第四章 部署已签发的证书
证书生成好以后,我们需要把证书复制给对应的 Apache、Nginx 或其他服务器去使用。
必须使用 --install-cert
命令来把证书复制到目标文件,请勿直接使用 ~/.acme.sh/
目录下的证书文件,这里面的文件都是内部使用,而且目录结构将来可能会变化。
4.1 部署到nginx
acme.sh --install-cert -d www.hugbg.com --key-file /data/hugbg/nginx/conf/conf.d/cert/www.hugbg.com.key --fullchain-file /data/hugbg/nginx/conf/conf.d/cert/www.hugbg.com.pem --reloadcmd "docker restart nginx"
- --install-cert:表示安装证书。
- -d www.hugbg.com:指定要安装证书的域名。
- --key-file:指定私钥文件的路径,私钥是用于加密和解密通信的关键文件。
- --fullchain-file:指定证书链文件的路径,包含了你的域名证书以及中间证书。
- --reloadcmd:重新加载的命令,证书安装后会执行这个命令。
[root@VM-24-15-centos .acme.sh]# acme.sh --install-cert -d www.hugbg.com --key-file /data/hugbg/nginx/conf/conf.d/cert/www.hugbg.com.key --fullchain-file /data/hugbg/nginx/conf/conf.d/cert/www.hugbg.com.pem --reloadcmd "docker restart nginx"
[Tue Feb 11 15:58:19 CST 2025] The domain 'www.hugbg.com' seems to already have an ECC cert, let's use it.
[Tue Feb 11 15:58:19 CST 2025] Installing key to: /data/hugbg/nginx/conf/conf.d/cert/www.hugbg.com.key
[Tue Feb 11 15:58:19 CST 2025] Installing full chain to: /data/hugbg/nginx/conf/conf.d/cert/www.hugbg.com.pem
[Tue Feb 11 15:58:19 CST 2025] Running reload cmd: docker restart nginx
nginx
[Tue Feb 11 15:58:20 CST 2025] Reload successful
[root@VM-24-15-centos .acme.sh]#
4.2 自动续签
到这一步就已经全部完成了,下面不需要其它配置,自动续签已经默认配置好了,还记得安装时候的那个计划任务吗?
这个就是自动续签用的。
它会每天检查一遍acme.sh
申请的证书是否到期,到期前30天就会进行自动续签。
方便的地方在于,前面以前保存了DNS API,所以它会自动根据的API进行DNS验证,不需要手动执行了,以及后面的证书签发和部署的配置,它都已经保存了下来,都是自动进行的了。
我们可以手动执行下这个命令,看一下结果:
可以看到每个证书的更新时间,它用的是 UTC+0**时区,+8h 即可东八区时间(CST)**。
https://www.hugbg.com/archives/3860.html
评论