手里吃灰的域名越来越多,偶尔还是会拿来测试测试,每次手动配置证书就很麻烦,刚好最近Let's Encrypt Authority也由X3更新为了R3版本,使用了新的OCSP地址,解决了污染问题。(此处想说点什么,但还是算了QAQ)因此又用回acme.sh自动签发更新证书,官方有很详细的使用文档,这里只做简单记录。

安装

curl  https://get.acme.sh | sh

若后面出现command not found,则需要手动执行以下命令:

source ~/.bashrc

生成证书

HTTP认证方式

该方式acme.sh会在你的指定的网站根目录下自动生成一个文件,来验证域名所有权,然后自动完成验证并签发证书:

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

完成后会自动删除验证文件,无需多余操作。

DNS认证方式(推荐)

这里为了方便,选择通过DNS认证方式,这种方式不需要服务器和公网IP,只需要DNS的解析记录即可完成验证,一般主流域名服务商都提供API接口,acme.sh目前支持包括主流的CloudFlare、DNSPod、Aliyun、Amazon Route53在内的多达131个的域名API,你这可以在这里查看到详细的支持列表。我的DNS服务器一般用的是Cloudflare,因此这里以Cloudflare的API为例验证,获取Cloudflare API,可以自己选择全局api还是单域api,我这里选择了单域api,获取到api后注意保存,然后导入:

export CF_Token="xxxxxxxxxxxxxxxxxxxxxxxx"
export CF_Account_ID="xxxxxxxxxxxxxxxxxxxxxxxx"
export CF_Zone_ID="xxxxxxxxxxxxxxxxxxxxxxxx"

其中CF_Token为你获取到的API密钥,CF_Account_ID和CF_Zone_ID可以在你域名概述页面的API分栏看到。

生成证书:

acme.sh --issue --dns dns_cf -d mydomain.com -d www.mydomain.com

若要生成通配符证书,则:

acme.sh --issue --dns dns_cf -d mydomain.com -d *.mydomain.com

2021年6月29日更新

今天准备签发一张证书,结果发现提示错误:

acme.sh is using ZeroSSL as default CA now.
Please update your account with an email address first.

然后去 Github 上项目看了下,发现一篇公告,说是从8月1日起,默认 CA 将换成 ZeroSSL,不过这不是还没到8月1日么...虽然 ZeroSSL 以前了解过也不错,同样支持免费签发 90 天期限的证书,包括通配符和 ECC 证书,甚至还支持 IP 证书,不过需要注册账号才行。至于为什么变成了 ZeroSSL,从这篇公告来看,应该是 acme.sh 被 apilayer 收购了。不过我还是习惯了 Let's Encrypt 的方便,想要继续使用 letsencryp 证书,公告里也给出了两种解决方案。

第一种是签发证书时指定 CA:

acme.sh  --issue --dns dns_cf -d mydomain.com  --server  letsencrypt

另一种是直接更改默认 CA:

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

如果设置了默认的 CA,以后就算版本升级也将一直默认使用指定的 CA。


大概30s左右就能成功签发证书,证书生成后会将你前面提供的api信息自动记录下来,将来在使用的时候就不需要再次指定了,直接生成:

acme.sh  --issue   -d  mydomain2.com   --dns  dns_cf

安装证书

默认生成的证书都放在安装目录下:~/.acme.sh/,建议使用--install-cert命令指定目标位置,将证书文件复制到相应的位置,这里用Nginx示例:

acme.sh --install-cert -d mydomain.com \
--key-file       /path/to/ssl/private.key  \
--fullchain-file /path/to/ssl/fullchain.pem \
--reloadcmd     "service nginx force-reload"

这里指定的所有参数都会被自动记录下来,并在将来证书自动更新以后,被再次自动调用,目前证书在60天以后会自动更新,无需任何操作。

如果要撤销一个证书,使用:

acme.sh --list
acme.sh --revoke -d mydomain.com

如果要删除一个证书,使用:

acme.sh --list
acme.sh --remove -d mydomain.com

更新acme.sh

升级acme.sh到最新版:

acme.sh --upgrade

开启自动升级:

acme.sh  --upgrade  --auto-upgrade

关闭自动更新:

acme.sh --upgrade  --auto-upgrade  0

Tags: SSL

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.