acme.sh使用教程

一、输入一下命令进行安装:

1
curl https://get.acme.sh | sh -s email=你的邮箱

命令运行完成后 acme.sh 会被安装到:

1
~/.acme.sh

二、证书签发

1.直接签发

只需要指定域名,并指定域名所在的网站根目录 acme.sh 会全自动的生成验证文件,并放到网站的根目录,验证完成后会聪明的删除验证文件,整个过程没有任何副作用。

1
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/

(1).使用 Apache 模式

如果你用的 Apache 服务器,acme.sh 还可以智能的从 Apache 的配置中自动完成验证,你不需要指定网站根目录:

1
acme.sh --issue --apache -d example.com -d www.example.com -d cp.example.com

(2).使用 Nginx 模式

如果你用的 Nginx 服务器,或者反代,acme.sh 还可以智能的从 Nginx 的配置中自动完成验证,你不需要指定网站根目录:

1
acme.sh --issue --nginx -d example.com -d www.example.com -d cp.example.com
  • 注意,无论是 Apache 还是 Nginx 模式,acme.sh 在完成验证之后,会恢复到之前的状态,都不会私自更改程序本身的配置。好处是你不用担心配置被搞坏,也有一个缺点,你需要自己配置 SSL 项,否则只能成功生成证书,你的网站还是无法正常使用 HTTPS。

2.使用独立服务模式

如果 80 端口是空闲的,acme.sh 还能假装自己是一个 WebServer,临时监听 80 端口,完成验证:

1
acme.sh --issue --standalone -d example.com -d www.example.com -d cp.example.com

3.手动验证

(1).纯手动验证

这需要你手动在域名上添加一条 TXT 解析记录,验证域名所有权。

注意,如果使用手动验证,acme.sh 将无法自动更新证书,每次都需要手动添加解析来验证域名所有权。如果有自动更新证书的需求,请使用自动验证(DNS API)。

1
acme.sh --issue --dns -d example.com -d www.example.com -d cp.example.com --yes-I-know-dns-manual-mode-enough-go-ahead-please

然后,acme.sh 会生成相应的解析记录显示出来,你只需要在你的域名管理面板中添加这条 TXT 记录即可。

等待解析完成之后,执行以下命令重新生成证书:

1
acme.sh --renew --dns -d example.com --dns -d www.example.com --dns -d cp.example.com --yes-I-know-dns-manual-mode-enough-go-ahead-please

注意这里现在用的是 参数 --renew

(2).自动验证(DNS API)

请参考:

1
https://github.com/acmesh-official/acme.sh/wiki/dnsapi

三、复制证书

证书生成好以后,我们需要把证书复制给对应的 Apache、Nginx 或其他服务器去使用。

必须使用 命令来把证书复制到目标文件,请勿直接使用 目录下的证书文件,这里面的文件都是内部使用,而且目录结构将来可能会变化:--install-cert

Apache 示例:

1
2
3
4
5
acme.sh --install-cert -d example.com \
--cert-file /path/to/certfile/in/apache/cert.pem \
--key-file /path/to/keyfile/in/apache/key.pem \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd "service apache2 force-reload"

Nginx 示例:

1
2
3
4
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"

默认情况下,证书每 60 天更新一次(可自定义)。更新证书后,Apache 或者 Nginx 服务会通过 传递的命令自动重载配置。

  • 注意:证书会自动申请续签,但是如果没有正确的命令,证书可能无法被重新应用到 Apache 或者 Nginx,因为配置没有被重载。reloadcmdreloadcmd

  • 注:我是直接使用 ~/acme.sh/example.com 文件夹内的文件,只需要将 fullchain.cer 在上, ca.cer 在下拼合在一个文件,就可以拼合一个有完整证书链的一个证书,私钥为 example.com.key,但是这样操作极其不规范,不建议使用.

四、其它

1.各 CA 对比

以下排序按我个人推荐程度进行排列

CA 时长(天) 签发ECC证书 单证书最大域名个数 国际化域名 测试服务器
ZeroSSL 90 根证书为RSA 100 支持 没有
Let’s Encrypt 90 根证书为ECC 100 支持
Google 90 根证书为RSA 100 不支持
SSL.com 104 根证书为ECC 2 支持 没有
Buypass 180 根证书为RSA 5 支持

注:仅 ZeroSSL 支持使用 Http 认证方式签发IP证书

2.修改默认 CA

acme.sh 脚本默认 CA 服务器是 ZeroSSL ,有时可能会导致获取证书的时候一直出现:The CA is processing your order,please just wait.

只需要把 CA 服务器改成 Let’s Encrypt 即可,虽然更改以后还是有概率出现 pending,但基本 2-3 次即可成功

1
acme.sh --set-default-ca --server letsencrypt

更高级的用法请参考: https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert

3.有关ZeroSSL

如果使用ZeroSSL签发证书提示需要指定 KeyID:

1
2
3
4
5
6
7
Using CA: https://acme.zerossl.com/v2/DV90
Registering account: https://acme.zerossl.com/v2/DV90
Already register EAB.
ACCOUNT_THUMBPRINT='XXXXXXXXXXXXXXXXXXXXXXX'
Single domain='sub.mydomain.com.br'
Getting domain auth token for each domain
Create new order error. Le_OrderFinalize not found. {"type":"urn:ietf:params:acme:error:malformed","status":400,"detail":"A Key ID MUST be specified"}

请使用 EAB 凭据:

使用外部帐户绑定 (EAB) 凭据引导,如下所示:

https://app.zerossl.com/developer 生成 EAB 凭据

注册 EAB 凭据:

1
2
3
acme.sh  --register-account  --server zerossl \
--eab-kid xxxxxxxxxxxx \
--eab-hmac-key xxxxxxxxx

4.有关Google Trust Services

使用ACME申请证书的服务器必须可以访问谷歌

请按照Google的指南创建 EAB 密钥和 EAB ID:

https://cloud.google.com/public-certificate-authority/docs/quickstart

注册 EAB 凭据:

1
2
3
acme.sh  --register-account  -m  myemail@example.com --server google \
--eab-kid xxxxxxx \
--eab-hmac-key xxxxxxx
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2023-2025 Xiaolan

请我喝杯咖啡吧~