利用acme.sh申请Letsencrypt通配符证书

Letsencrypt在2018年要推出通配符域名证书的消息早已有之,但期间跳过票,好在官方一直保持着与用户的沟通,并且跳票时间也不算久,三月份终于掀开盖头来了。不管官方自有的申请操作流程和工具如何可靠,我一直是使用VestaCP集成在面板中的证书申请和管理方式,但这次终于有点坐不住了,一来总想试一下命令行界面的申请过程,二来VestaCP官方也一直没有什么具体的消息会在什么时候把针对通配符证书的申请功能纳入到面板中来,三来则是Letsencrypt官方推荐的工具之一是位中国程序员Neilpang的作品,且使用范围和功能超出预期,提供了DNS验证和更新的功能,正好有适用CloudFlare的模板。

以下的操作流程涉及到具体的信息仅作为参考,如域名、用户名和文件目录名称。

到Neilpang的Github项目主页上按说明一步一步操作,先登录进服务器执行

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

然后从CloudFlare获取API信息,记录下API值与相应的邮件地址。再进入/root/.acme.sh/dnsapi打开对应的文件[1]dns_cf.sh,将头部(约第4和第6行)的内容修改为用户自己CloudFlare账号的API值和邮件地址。

1
2
3
#CF_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
#
#CF_Email="[email protected]"

接着,在/root/.acme.sh/下执行命令

1
acme.sh --issue --dns dns_cf -d bizedu.net -d '*.bizedu.net'

其中 –issue 表示要求Letsencrypt颁布证书,–dns 表示证书申请方式是DNS验证模式,dns_cf 是指采用CloudFlare的配置文件,-d 表示后面跟随的是所申请的域名。在这里我为bizedu.net这个域名以及其它所有该域名的二级域名申请SSL证书,* 即是这个通配符,代表所有的二级域名名称。

程序运行过程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[[email protected] ~]# acme.sh --issue --dns dns_cf -d bizedu.net -d '*.bizedu.net'
[Sun Mar 25 08:50:07 EDT 2018] Registering account
[Sun Mar 25 08:50:08 EDT 2018] Registered
[Sun Mar 25 08:50:08 EDT 2018] ACCOUNT_THUMBPRINT='此处一串代码为账户数字指纹信息'
[Sun Mar 25 08:50:08 EDT 2018] Creating domain key
[Sun Mar 25 08:50:08 EDT 2018] The domain key is here: /root/.acme.sh/bizedu.net/bizedu.net.key
[Sun Mar 25 08:50:08 EDT 2018] Multi domain='DNS:bizedu.net,DNS:*.bizedu.net'
[Sun Mar 25 08:50:08 EDT 2018] Getting domain auth token for each domain
[Sun Mar 25 08:50:09 EDT 2018] Getting webroot for domain='bizedu.net'
[Sun Mar 25 08:50:09 EDT 2018] Getting webroot for domain='*.bizedu.net'
[Sun Mar 25 08:50:09 EDT 2018] Found domain api file: /root/.acme.sh/dnsapi/dns_cf.sh
[Sun Mar 25 08:50:09 EDT 2018] You didn't specify a cloudflare api key and email yet.
[Sun Mar 25 08:50:09 EDT 2018] Please create the key and try again.
[Sun Mar 25 08:50:09 EDT 2018] Error add txt for domain:_acme-challenge.bizedu.net
[Sun Mar 25 08:50:09 EDT 2018] Please add '--debug' or '--log' to check more details.
[Sun Mar 25 08:50:09 EDT 2018] See: https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh
[[email protected] ~]# acme.sh --issue --dns --log dns_cf -d bizedu.net -d '*.bizedu.net'
[Sun Mar 25 08:53:15 EDT 2018] It seems that you are using dns manual mode. Read this link first: https://github.com/Neilpang/acme.sh/wiki/dns-manual-mode
[[email protected] ~]# acme.sh --issue --dns dns_cf -d bizedu.net -d '*.bizedu.net'
[Sun Mar 25 08:54:58 EDT 2018] Multi domain='DNS:bizedu.net,DNS:*.bizedu.net'
[Sun Mar 25 08:54:58 EDT 2018] Getting domain auth token for each domain
[Sun Mar 25 08:54:59 EDT 2018] Getting webroot for domain='bizedu.net'
[Sun Mar 25 08:54:59 EDT 2018] Getting webroot for domain='*.bizedu.net'
[Sun Mar 25 08:54:59 EDT 2018] Found domain api file: /root/.acme.sh/dnsapi/dns_cf.sh
[Sun Mar 25 08:55:00 EDT 2018] Adding record
[Sun Mar 25 08:55:00 EDT 2018] Added, OK
[Sun Mar 25 08:55:00 EDT 2018] Found domain api file: /root/.acme.sh/dnsapi/dns_cf.sh
[Sun Mar 25 08:55:01 EDT 2018] Adding record
[Sun Mar 25 08:55:02 EDT 2018] Added, OK
[Sun Mar 25 08:55:02 EDT 2018] Sleep 120 seconds for the txt records to take effect
[Sun Mar 25 08:57:03 EDT 2018] Verifying:bizedu.net
[Sun Mar 25 08:57:06 EDT 2018] Success
[Sun Mar 25 08:57:06 EDT 2018] Verifying:*.bizedu.net
[Sun Mar 25 08:57:08 EDT 2018] Success
[Sun Mar 25 08:57:08 EDT 2018] Removing DNS records.
[Sun Mar 25 08:57:11 EDT 2018] Verify finished, start to sign.
[Sun Mar 25 08:57:11 EDT 2018] Cert success.
-----BEGIN CERTIFICATE-----
此处一大堆“乱码”就是证书文件内容
-----END CERTIFICATE-----
[Sun Mar 25 08:57:11 EDT 2018] Your cert is in /root/.acme.sh/bizedu.net/bizedu.net.cer
[Sun Mar 25 08:57:11 EDT 2018] Your cert key is in /root/.acme.sh/bizedu.net/bizedu.net.key
[Sun Mar 25 08:57:11 EDT 2018] The intermediate CA cert is in /root/.acme.sh/bizedu.net/ca.cer
[Sun Mar 25 08:57:11 EDT 2018] And the full chain certs is there: /root/.acme.sh/bizedu.net/fullchain.cer
[[email protected] ~]#

这样,通配符域名证书就申请下来并被保存在用户目录下的域名名称文件夹内,就是~/.acme.sh/bizedu.net/下。下一步,官方推荐的证书安装方式是执行install命令,如[2]

1
acme.sh --installcert -d bizedu.net --key-file /home/admin/conf/web/ssl.bizedu.net.key --fullchain-file /home/admin/conf/web/ssl.bizedu.net.pem --reloadcmd "service nginx force-reload"

这个命令稍复杂,实际上就是把申请所得的证书文件复制到比如主机面板存放相关网站证书的目录中去。以VestaCP面板中admin账户为例,在 /home/admin/conf/web/,以CyberPanel为例,在 /usr/local/lsws/conf/vhosts/SSL-bizedu.net/[3]

如果不直接使用acme.sh自带的证书安装命令,那么通常可以进行手工复制或设定软链接,如

1
2
ln -s /root/.acme.sh/bizedu.net/bizedu.net.chained.crt /home/admin/conf/web/ssl.bizedu.net.pem
ln -s /root/.acme.sh/bizedu.net/bizedu.net.key /home/admin/conf/web/ssl.bizedu.net.key

  1. 按官方说明,这两个值可以用export命令填在/root/.acme.sh/account.conf文件中,但当时没有注意到。实际上写进dns_cf.sh中可能更直接。 ↩︎

  2. 最后的reloadmd命令起到的作用是在复制完证书后让Web服务器重新载入证书信息。不同的web服务器对应的命令不同,如LiteSpeed(以及它的开源社区版OLS)默认为--reloadcmd "/usr/local/lsws/bin/lswsctrl restart" ↩︎

  3. CyberPanel是目前唯一一款与OpenLiteSpeed http server整合的Linux型主机面板。OLS效率和性能惊人,存放证书的目录也与众不同,初装者一般不容易找着证书存放目录。 ↩︎