前言
certbot 安装还是过于麻烦, snap 不轻量,不使用 snap 使用 nginx 申请容易出问题,使用 acme.sh 申请 ssl 证书 之后,发现很方便
相比于 certbot 不同的地方在于 acme 使用 nginx/apaceh 申请证书不会修改原有的配置
- 好处:不用担心配置被搞坏
- 缺点:需要手动配置 ssl 证书的位置。
简介
acme.sh 是一个轻量级的、纯 Shell 脚本实现的 ACME 协议客户端,主要用于自动化获取和续订 SSL/TLS 证书。它支持 Let’s Encrypt 和其他 ACME 兼容的证书颁发机构(CA)。
主要特点
- 简单易用:用户只需通过简单的命令行操作即可获取和管理证书。
- 轻量级:不依赖于复杂的编程语言,易于部署和维护。
- 多种 DNS 插件:支持多种 DNS 提供商的 API,便于自动化 DNS 验证。
- 支持多种证书类型:可以获取通配符证书和普通域名证书。
- 灵活的配置:支持用户自定义配置和命令,满足不同需求。
acme.sh 是一个非常适合希望简化 SSL/TLS 证书管理流程的用户和开发者的工具。
项目地址:https://github.com/acmesh-official/acme.sh
后续所有 SSL/TLS 证书
简称 证书
快速上手
如果你想直接使用 acme.sh 这里提供一个简要教程
需要修改:
- 邮箱
mail@yourdomain.com
- 域名
yourdomain.com
安装 acme.sh
将 mail@yourdoamin.com
修改为申请证书的邮箱
|
|
刷新环境变量
|
|
修改证书 CA 机构
|
|
申请证书
|
|
创建证书文件夹
|
|
安装证书
|
|
详细内容请查看后续
安装 acme.sh
国外服务器
将 mail@yourdoamin.com
修改为申请证书的邮箱
|
|
|
|
国内服务器
将 mail@yourdoamin.com
修改为申请证书的邮箱
|
|
卸载 acme.sh
待续
|
|
修改证书 CA 机构
默认证书的 CA 机构是 zerossl
在申请证书之前,可以通过如下命令修改 CA 机构
|
|
生成证书:HTTP 方式
apache
待续…
nginx
先在 nginx 配置文件夹新增 conf 文件,填好基础的模板,比如:
|
|
修改为自己的信息
再使用 acme.sh 申请
|
|
no web server
如果你还没有运行任何 web 服务, 80 端口是空闲的, 那么 acme.sh 还能假装自己是一个 webserver, 临时听在80 端口, 完成验证:
|
|
更高级的用法请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert
生成证书:DNS 方式(推荐)
手动 DNS 方式
手动在域名上添加一条 txt 解析记录, 验证域名所有权.
好处:你不需要任何服务器, 不需要任何公网 ip, 只需要 dns 的解析记录即可完成验证
缺点:如果不同时配置 Automatic DNS API,使用这种方式 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。
|
|
然后, acme.sh 会生成相应的解析记录显示出来, 你只需要在你的域名管理面板中添加这条 txt 记录即可.
等待解析完成之后, 重新生成证书:
|
|
注意第二次这里用的是 --renew
自动 DNS 方式(推荐)
DNS 方式的强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证
acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商的自动集成
cloudflare
域名托管在 cloudflare 上申请方式
单个域名
登录 cloudflare ,
查看域名的 Zone ID
|
|
创建 API Token
设置环境变量
|
|
申请证书
|
|
证书就会自动生成了. 这里环境变量会被自动记录下来, 将来在使用的时候, 就不需要再次指定了,直接生成就好了
更多内容:https://github.com/acmesh-official/acme.sh/wiki/dnsapi#1-cloudflare-option
dnspod
域名托管在 dnspod 上
登录 dnspod 账号, 生成 api id 和 api key。
设置 dnspod id
|
|
设置 dnspod token
|
|
申请证书
|
|
证书就会自动生成了. 这里给出的 api id 和 api key 会被自动记录下来, 将来在使用 dnspod api 的时候, 就不需要再次指定了,直接生成就好了
|
|
安装证书
前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方.
注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/
, 请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化.
正确的使用方法是使用 --install-cert
命令,并指定目标位置, 然后证书文件会被 copy 到相应的位置
Apache
|
|
Nginx
|
|
可自由指定位置,请保证/etc/nginx/ssl/yourdomain.com
路径存在
一个小提醒, 这里用的是 service nginx force-reload
, 不是 service nginx reload
, 据测试, reload
并不会重新加载证书, 所以用的 force-reload
Nginx 的配置 ssl_certificate
使用 /etc/nginx/ssl/fullchain.cert
,而非 /etc/nginx/ssl/<domain>.cert
,否则 SSL Labs 的测试会报 Chain issues Incomplete
错误。
--install-cert
命令可以携带很多参数, 来指定目标文件. 并且可以指定 reloadcmd, 当证书更新以后, reloadcmd 会被自动调用,让服务器生效.
详细参数请参考: https://github.com/Neilpang/acme.sh#3-install-the-issued-cert-to-apachenginx-etc
值得注意的是, 这里指定的所有参数都会被自动记录下来, 并在将来证书自动更新以后, 被再次自动调用.
查看证书
查看已安装证书信息
|
|
更新证书
目前证书在 60 天以后会自动更新, 你无需任何操作. 今后有可能会缩短这个时间, 不过都是自动的, 你不用关心
请确保 cronjob 正确安装, 看起来是类似这样的:
|
|
关于修改 ReloadCmd
目前,修改 ReloadCmd
并没有专门的命令实现。我们可以通过重新安装证书来间接达到修改的目的。
此外,安装证书后,相关信息会保存在 ~/.acme.sh/yourdomain.com/example.conf
文件中,内容与执行 acme.sh --info -d yourdomain.com
输出的信息一致,但 ReloadCmd
在文件中使用了 Base64 编码。
理论上,我们可以直接修改该文件来更改 ReloadCmd
,而且在修改时无需进行 Base64 编码,直接写入命令的原文 acme.sh
也能被识别。
然而,请注意,example.conf
文件的位置和内容格式在未来可能会发生变化!该文件一直以来都是内部使用,未来可能会转为使用 SQLite 或 MySQL 格式存储。因此,一般不建议自行修改。
更新 acme.sh
目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步
升级 acme.sh 到最新版
|
|
如果你不想手动升级, 可以开启自动升级
|
|
之后, acme.sh 就会自动保持更新了
你也可以随时关闭自动更新
|
|
出错怎么办
如果出错, 请添加 debug log:
|
|
或者:
|
|
请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh
在 DNS 验证模式下如果 debug 中出现诸如"timed out"等字样可能是因为 GFW 拦截了相应请求,需要添加 http(s) proxy 环境变量。(请按照自己实际设定修改)
|
|
如果是使用 docker 则完整示例配置如下:
|
|
上述例子中使用 cloudflare 的 DNS 来签发证书,并通过把 acme.sh 链接到容器[代理 A],来转发 curl 请求(请按照自己实际设定修改)
最后, 本文并非完全的使用说明, 还有很多高级的功能, 更高级的用法请参看其他 wiki 页面.
https://github.com/Neilpang/acme.sh/wiki
删除证书
要使用 acme.sh
删除证书,主要涉及两个步骤:吊销 (revoke) 证书和移除 (remove) acme.sh
对该域名的管理。
重要提示:
- 吊销证书 (Revoke): 吊销证书会告知证书颁发机构 (CA) 该证书已不再受信任。这通常在你认为私钥可能已泄露时才需要执行。如果你只是想停止使用该证书,或者换用另一个证书,通常不需要吊销。吊销操作是不可逆的。
- 移除证书 (Remove): 移除操作会从
acme.sh
的配置中删除该域名的证书信息,停止acme.sh
对其进行自动续期。这并不会从 CA 那里吊销证书,也不会删除你服务器上已安装的证书文件。
以下是具体步骤:
吊销证书(可选但推荐,如果私钥可能泄露):
|
|
移除 acme.sh
对该域名的管理:
|
|
常用命令
查看证书列表
|
|
吊销证书
|
|
移除证书
|
|
使用 DNS 自动更新
|
|
修改 SSL 证书默认的 CA 机构
|
|
一键脚本(待续)
待续…