外观
acme申请证书
参考资料
acme仓库:acmesh-official/acme.sh: A pure Unix shell script implementing ACME client protocol
acme说明:说明 · acmesh-official/acme.sh Wiki
参考文章:正确使用 acme.sh, 让你的网站永久使用 ssl 证书,It's free!
# 安装 cron
apt install cron
# 查看定时任务
crontab -l
安装 acme.sh
安装很简单,一条命令:
curl https://get.acme.sh | sh -s email=my@example.com
或者
wget -O - https://get.acme.sh | sh -s email=my@example.com
普通用户和 root 用户都可以安装使用。
注意:如果安装完成后提示 -bash: acme.sh: command not found
,需要手动执行 source ~/.bashrc
生成证书
acme.sh 实现了 acme 协议支持的所有验证协议,支持HTTP 和 DNS 验证。
修改默认 CA
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
DNS 验证
如果你没有服务器,没有公网 IP,只需要 DNS 的解析记录即可完成验证。
手动验证
这需要你手动在域名上添加一条 TXT 解析记录,验证域名所有权。
注意,如果使用手动验证,acme.sh 将无法自动更新证书,每次都需要手动添加解析来验证域名所有权。如果有自动更新证书的需求,请使用自动验证(DNS API)。
acme.sh --issue --dns -d example.com -d www.example.com -d cp.example.com
然后,acme.sh 会生成相应的解析记录显示出来,你只需要在你的域名管理面板中添加这条 TXT 记录即可。
等待解析完成之后,执行以下命令重新生成证书:
acme.sh --renew -d mydomain.com
注意这里现在用的是 --renew
参数
自动验证(DNS API)
DNS 方式的真正强大之处在于可以使用域名解析商提供的 API 自动添加 TXT 记录,且在完成验证后删除对应的记录。
acme.sh 目前支持超过一百家的 DNS API。
以 Cloudflare 为例,你需要先登录到 Cloudflare ,拿到你的 Cloudflare Token 和 ID 并设置:
export CF_Token="Y_jpG9AnfQmuX5Ss9M_qaNab6SQwme3HWXNDzRWs"
export CF_Zone_ID="763eac4f1bcebd8b5c95e9fc50d010b4"
现在我们可以签发通配符证书了:
acme.sh --issue --dns dns_cf -d example.com
提示
CF_Token
和 CF_Token
将保存在 ~/.acme.sh/account.conf
中,并在需要时自动获取,无需手动再设置。
以上内容是官方文档的描述,实际应用中并未保存。
更详细的 DNS API 用法: https://github.com/acmesh-official/acme.sh/wiki/dnsapi
配置证书
证书生成好以后,我们需要把证书复制给对应的 Apache、Nginx 或其他服务器去使用。
必须使用 --install-cert
命令来把证书复制到目标文件,请勿直接使用 ~/.acme.sh/
目录下的证书文件,这里面的文件都是内部使用,而且目录结构将来可能会变化。
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 reload"
注
在 Nginx 示例中的/path/to/keyfile/in/nginx/
要根据实际的证书路径进行更换;key.pem
和cert.pem
也要根据实际证书名称更换,例如example.com.key
和fullchain.cer
。
--reloadcmd
是很重要的,但是在某些情况下是不需要的,所以这一行需不需要要具体分析。
--reloadcmd "service nginx reload"
这行代码有文章介绍说需要写成--reloadcmd "service nginx force-reload"
,因为reload
并不会重新加载证书, 所以用的 force-reload
。
Nginx 的配置项 ssl_certificate
需要使用 /etc/nginx/ssl/fullchain.cer
,而非 /etc/nginx/ssl/<domain>.cer
,否则 SSL Labs 的测试会报证书链问题(Chain issues Incomplete
)。
默认情况下,证书每 60 天更新一次(可自定义)。更新证书后,Apache 或者 Nginx 服务会通过 reloadcmd
传递的命令自动重载配置。
注意:reloadcmd
非常重要。证书会自动申请续签,但是如果没有正确的 reloadcmd
命令,证书可能无法被重新应用到 Nginx,因为配置没有被重载。
相关参数保存在 ~/acme.sh/[你的域名]/[你的域名].conf
配置文件中。
查看已安装证书信息
acme.sh --info -d example.com
会输出如下内容:
DOMAIN_CONF=/root/.acme.sh/example.com/example.com.conf
Le_Domain=example.com
Le_Alt=no
Le_Webroot=dns_ali
Le_PreHook=
Le_PostHook=
Le_RenewHook=
Le_API=https://acme-v02.api.letsencrypt.org/directory
Le_Keylength=
Le_OrderFinalize=https://acme-v02.api.letsencrypt.org/acme/finalize/23xxxx150/781xxxx4310
Le_LinkOrder=https://acme-v02.api.letsencrypt.org/acme/order/233xxx150/781xxxx4310
Le_LinkCert=https://acme-v02.api.letsencrypt.org/acme/cert/04cbd28xxxxxx349ecaea8d07
Le_CertCreateTime=1649358725
Le_CertCreateTimeStr=Thu Apr 7 19:12:05 UTC 2022
Le_NextRenewTimeStr=Mon Jun 6 19:12:05 UTC 2022
Le_NextRenewTime=1654456325
Le_RealCertPath=
Le_RealCACertPath=
Le_RealKeyPath=/etc/acme/example.com/privkey.pem
Le_ReloadCmd=service nginx force-reload
Le_RealFullChainPath=/etc/acme/example.com/chain.pem
更新证书
目前证书每 60 天自动更新,你无需任何操作。
但是你也可以强制续签证书:
acme.sh --renew -d example.com --force
关于修改 reloadcmd
目前修改 reloadcmd
没有专门的命令,可以通过重新安装证书来实现修改 reloadcmd
的目的。
此外,安装证书后,相关信息是保存在 ~/.acme.sh/example.com/example.conf
文件下的,内容就是 acme.sh --info -d example.com
输出的信息,不过 reloadcmd
在文件中使用了 Base64 编码。理论上可以通过直接修改该文件来修改 ReloadCmd
,且修改时,无需 Base64 编码,直接写命令原文 acme.sh
也可以识别。
不过,由于 example.conf
文件的位置和内容格式以后可能会改变,且 example.conf
一直都是内部使用,后续也有可能会改为用 SQLite 或者 MySQL 格式存储. 所以一般不建议自己修改。
更新 acme.sh
acme.sh 还在不断开发中,因此强烈建议保持并使用最新的版本。
升级 acme.sh 到最新版:
acme.sh --upgrade
如果你不想手动升级,可以开启自动升级:
acme.sh --upgrade --auto-upgrade
之后,acme.sh 就会自动保持更新了。
你也可以随时关闭自动更新:
acme.sh --upgrade --auto-upgrade 0
最后,本文并非完全的使用说明,还有很多高级的功能,更高级的用法请参看 wiki 页面:https://github.com/acmesh-official/acme.sh/wiki/