更方便的 Let's Encrypt 证书工具 - acme.sh

前言

Let's Encrypt 在近两年的发展中十分迅速. 官方在2016年3月8日宣布签发证书达到一百万张后( Our Millionth Certificate ), 在一年半后的2017年6月28号便宣布签发证书达到了一亿张( Milestone: 100 Million Certificates Issued ).

官方也宣布在2018年一月份(鸽了,三月份)开始支持签发泛域名证书( Wildcard Certificates Coming January 2018 ),在使用和部署上会变得更加方便.

官方的签发工具是 certbot ,它可以启动一个 Web 服务器来验证域名所有权,也可以用配置文件指定 NginxWebRoot 目录来验证( 需要在 Nginx 配置相应路由 .well-known/ ).

但是在开始使用 CloudFlare 的服务后,我发现 certbot 使用 DNS-01 验证方式比较麻烦懒的看官方的 Authenticator. 然后我就换成 acme.sh 了.

配置

自动安装 ( 喜欢手动安装看 这里 )

1
2
3
wget -O -  https://get.acme.sh | sh
# or
curl https://get.acme.sh | sh

运行这个脚本会干以下事情:

  • acme.sh 安装到你的用户目录下: ~/.acme.sh/acme.sh

  • 创建 alias : . "/root/.acme.sh/acme.sh.env"

  • 创建定时任务 :

1
2
[email protected]:~# crontab -l
14 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

手动更新

1
acme.sh --upgrade

自动更新

1
acme.sh  --upgrade  --auto-upgrade

关闭自动更新

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

使用

WebRootStandalone 验证

WebRootStandalone 验证方式就不多说了,和 certbot 大同小异,看文档就好( English | 中文 )

DNS-01 验证

使用 –dns 选项来创建要验证域名的 TXT 记录

1
acme.sh --issue -d example.com --dns
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Fri Dec  1 15:17:45 +06 2017] Creating domain key
[Fri Dec 1 15:17:45 +06 2017] The domain key is here: /root/.acme.sh/example.com/example.com.key
[Fri Dec 1 15:17:45 +06 2017] Single domain='example.com'
[Fri Dec 1 15:17:46 +06 2017] Getting domain auth token for each domain
[Fri Dec 1 15:17:46 +06 2017] Getting webroot for domain='example.com'
[Fri Dec 1 15:17:46 +06 2017] Getting new-authz for domain='example.com'
[Fri Dec 1 15:17:47 +06 2017] The new-authz request is ok.
[Fri Dec 1 15:17:47 +06 2017] Add the following TXT record:
[Fri Dec 1 15:17:47 +06 2017] Domain: '_acme-challenge.example.com'
[Fri Dec 1 15:17:47 +06 2017] TXT value: 'h8cmiQ5_jqzqKK2ZDSnLjmosKGsjIoo69Tj9TbACHbw'
[Fri Dec 1 15:17:47 +06 2017] Please be aware that you prepend _acme-challenge. before your domain
[Fri Dec 1 15:17:47 +06 2017] so the resulting subdomain will be: _acme-challenge.example.com
[Fri Dec 1 15:17:47 +06 2017] Please add the TXT records to the domains, and retry again.
[Fri Dec 1 15:17:47 +06 2017] Please add '--debug' or '--log' to check more details.
[Fri Dec 1 15:17:47 +06 2017] See: https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh

添加 TXT 记录

DomainTXT value 记录下来,在域名管理商处添加对应的 TXT 记录,并等待其生效.

查询域名 TXT 记录

1
nslookup -type=txt _acme-challenge.example.com

TXT 记录生效后,便可生成证书.

1
acme.sh --renew -d example.com

使用第三方 API 验证

因为我用的是 CloudFlare,以下操作都是在此基础上进行的,不过和其他 API 也只是参数不同而已. 详看 这里

先去 CloudFlare 拿到 API key ( Overview -> Domain Summary -> Global API Key )

1
2
export CF_Key="your key"
export CF_Email="[email protected]"

设置完毕后便可以生成证书了.

1
acme.sh --issue --dns dns_cf -d example.com -d www.example.com

* 输入的参数会保存到 ~/.acme.sh/account.conf 中,以后会自动调用.

导出证书

使用 --installcert 命令来导出证书

1
2
3
4
acme.sh  --installcert  -d  example.com   \
--key-file /etc/nginx/ssl/private.key \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd "service nginx force-reload"
  • -d: 要导出的域名
  • –key-file: 导出私钥的位置
  • –fullchain-file: 导出证书的位置
  • –reloadcmd: 重载命令,这里用的是 Nginx ,具体的命令要看你用什么了

Wildcard - 通配符证书

2018-3-14 更新:

Let’s Encrypt 已在昨天上线 Wildcard 证书(目前只支持 DNS-01 验证方式),步骤其实和普通的域名差不多,只需增加通配符就可以了.

1
acme.sh --issue --dns dns_cf -d example.com -d *.example.com