使用acme.sh在阿里云aliyun获取Let's Encrypt wildcard通配符SSL证书

acme.sh:https://github.com/Neilpang/acme.sh

基本使用只要看github就好,这里我们着重讲wiki没有提到的内容。

Let's Encrypt 已经支持通配符SSL证书,这是很让人开心的事情。由于通配符域名的特殊性,比如说你不应该在只持有子域名如ailion.github.com时,就能申请到*.github.com的通配符证书,不然github就完蛋了。因此,通配符证书的申请要比普通证书申请更加复杂和严格。

acme.sh提供2种方式验证你持有整个域名的权限,那就是DNS的TXT记录校验。我不是说有2种方式吗?另一种dnsapi方式,本质上其实是一样的。今天我们就具体说一说dnsapi在阿里云上如何操作。

具体操作

首先,你需要一个子账户accesskey和secret,然后给它分配云解析DNS的读写权限。
snip20180710_2
只读权限是不可以的,因为它本质上还是通过添加TXT记录的方式来验证,所以它会用脚本来帮你添加。
看到这里的企业级运维读者,如果你具备职业敏感,就会倒吸一口凉气,然后关掉本文,采用手动TXT验证方式。万一这个脚本把生产环境DNS搞砸了,背锅侠肯定是你!

接下来,在bash中配好环境变量:

export Ali_Key="你的key"
export Ali_Secret="你的secret"

最后,参照Github教程:

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

dns_cf中,cf指的是CloudFlare,改为dns_ali

acme.sh  --issue -d example.com  -d '*.example.com'  --dns dns_ali

常见错误:

  1. 没有配置环境变量
root@xxxxxxxxxxx:/etc/letsencrypt# ./acme.sh --issue -d "*.mustu.cn" --dns dns_ali
[Tue Jul 10 17:21:28 CST 2018] Single domain='*.mustu.cn'
[Tue Jul 10 17:21:28 CST 2018] Getting domain auth token for each domain
[Tue Jul 10 17:21:30 CST 2018] Getting webroot for domain='*.mustu.cn'
[Tue Jul 10 17:21:30 CST 2018] Found domain api file: /etc/letsencrypt/dnsapi/dns_ali.sh
[Tue Jul 10 17:21:30 CST 2018] You don't specify aliyun api key and secret yet.
[Tue Jul 10 17:21:30 CST 2018] Error add txt for domain:_acme-challenge.mustu.cn
[Tue Jul 10 17:21:30 CST 2018] Please add '--debug' or '--log' to check more details.
[Tue Jul 10 17:21:30 CST 2018] See: https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh
  1. 子账户权限没给对
root@iZwz94wy4n7eofq2mcrfjlZ:/etc/letsencrypt# ./acme.sh --issue -d "*.mustu.cn" --dns dns_ali
[Tue Jul 10 17:23:27 CST 2018] Single domain='*.mustu.cn'
[Tue Jul 10 17:23:27 CST 2018] Getting domain auth token for each domain
[Tue Jul 10 17:23:29 CST 2018] Getting webroot for domain='*.mustu.cn'
[Tue Jul 10 17:23:29 CST 2018] Found domain api file: /etc/letsencrypt/dnsapi/dns_ali.sh
[Tue Jul 10 17:23:30 CST 2018] User not authorized to operate on the specified resource, or this API doesn't support RAM.
[Tue Jul 10 17:23:30 CST 2018] Error add txt for domain:_acme-challenge.mustu.cn
[Tue Jul 10 17:23:30 CST 2018] Please add '--debug' or '--log' to check more details.
[Tue Jul 10 17:23:30 CST 2018] See: https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh

留意:这里并不需要授权整个RAM的权限,只需要给它管理云解析DNS的权限即可。

成功以后:

root@iZwz94wy4n7eofq2mcrfjlZ:/etc/letsencrypt# ./acme.sh --issue -d "*.mustu.cn" --dns dns_ali
[Tue Jul 10 17:25:58 CST 2018] Single domain='*.mustu.cn'
[Tue Jul 10 17:25:58 CST 2018] Getting domain auth token for each domain
[Tue Jul 10 17:26:00 CST 2018] Getting webroot for domain='*.mustu.cn'
[Tue Jul 10 17:26:00 CST 2018] Found domain api file: /etc/letsencrypt/dnsapi/dns_ali.sh
[Tue Jul 10 17:26:02 CST 2018] Sleep 120 seconds for the txt records to take effect
[Tue Jul 10 17:28:03 CST 2018] Verifying:*.mustu.cn
[Tue Jul 10 17:28:06 CST 2018] Success
[Tue Jul 10 17:28:06 CST 2018] Removing DNS records.
[Tue Jul 10 17:28:09 CST 2018] Verify finished, start to sign.
[Tue Jul 10 17:28:11 CST 2018] Cert success.
-----BEGIN CERTIFICATE-----
就不告诉你
就不告诉你
就不告诉你
-----END CERTIFICATE-----
[Tue Jul 10 17:28:11 CST 2018] Your cert is in  /root/.acme.sh/*.mustu.cn/*.mustu.cn.cer 
[Tue Jul 10 17:28:11 CST 2018] Your cert key is in  /root/.acme.sh/*.mustu.cn/*.mustu.cn.key 
[Tue Jul 10 17:28:11 CST 2018] The intermediate CA cert is in  /root/.acme.sh/*.mustu.cn/ca.cer 
[Tue Jul 10 17:28:11 CST 2018] And the full chain certs is there:  /root/.acme.sh/*.mustu.cn/fullchain.cer 

证明工作原理的确是添加TXT记录,验证以后立马删除:
snip20180710_7