letsencrypt配置通配符域名证书
介绍
在今年稍早些的时候,letsencrypt终于开始免费支持通配符域名证书了.但是只支持一个层级的通配主机域名.
比如我曾经踩过的坑:*.dev.xxx.com通配符域名证书并不能支持api.v3.dev.xxx.com这种三层子域名.
如果需要为api.v3.dev.xxx.com申请通配符证书,则还需要申请*.v3.dev.xxx.com通配符证书
–
letsencryp通配符证书申请前提
ACME V2版本要求
为了实现通配符证书,Let’s Encrypt 对 ACME 协议的实现进行了升级,只有 v2 协议才能支持通配符证书。
也就是说任何客户端只要支持 ACME v2 版本,就可以申请通配符证书了,是不是很激动。
可以查看下自己惯用的客户端是不是支持 ACME v2 版本,官方介绍 Certbot 0.22.0 版本支持新的协议版本
1 | root@docker:~# ./certbot-auto --version |
验证域名所有权的方式
Let’s Encrypt颁发证书的时候,需要校验域名的所有权,证明操作者有权利为该域名申请证书,目前支持三种验证方式:
dns-01:给域名添加一个 DNS TXT 记录。
http-01:在域名对应的 Web 服务器下放置一个 HTTP well-known URL 资源文件。
tls-sni-01:在域名对应的 Web 服务器下放置一个 HTTPS well-known URL 资源文件。
而申请通配符证书,只能使用 dns-01 的方式
–
申请通配符证书方法
1 | ./certbot-auto certonly -d *.devapi.haoshiqi.net --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory |
介绍下相关参数:
- certonly,表示安装模式,Certbot 有安装模式和验证模式两种类型的插件。
- –manual 表示手动安装插件,Certbot 有很多插件,不同的插件都可以申请证书,用户可以根据需要自行选择
- -d 为那些主机申请证书,如果是通配符,输入 *.devapi.haoshiqi.net(可以替换为你自己的域名)
- –preferred-challenges dns,使用 DNS 方式校验域名所有权
- –server,Let’s Encrypt ACME v2 版本使用的服务器不同于 v1 版本,需要显示指定。
下面是命令输出:
1 | root@docker:~# ./certbot-auto certonly -d *.devapi.haoshiqi.net --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory |
首先,会要求是否同意IP和证书绑定. 输入y继续下一步
其次,会验证DNS的TXT记录.这里非常关键,先不要回车.Letsencrypt要求配置 DNS TXT 记录,从而校验域名所有权,也就是判断证书申请者是否有域名的所有权。
上面要求给_acme-challenge.devapi.haoshiqi.net配置一条TXT记录.记录值为:pjTQy43PDXAXBdP3roiftl1uzO-BBidaIG45703ReGs
我们使用的是DnsPort域名解析服务也就是腾讯DNS运营商.在域名的DNS解析记录里添加一条主机记录:_acme-challenge.devapi,对应上面的txt值即可.具体配置过程就不再介绍了
配置完成后,先检查一下配置是否生效:
1 | huangyong@huangyong-Macbook-Pro ~ dig -t txt _acme-challenge.devapi.haoshiqi.net @8.8.8.8 |
可以看到已经生效了.此时再回到刚才的界面,按回车键..输出如下信息:
1 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
证书申请成功,证书和秘钥保存在下面的目录
1 | root@docker:~# ls -l /etc/letsencrypt/live/devapi.haoshiqi.net/ |
–
Nginx配置证书
证书申请下来后,就可以在nginx配置证书了.配置方法比较简单.只需要在nginx配置文件中添加几行命令即可.例如:
1 | root@docker:~# vim /data/conf/nginx/conf.d/hsq-openapi.conf |
重启nginx,浏览器访问域名.通配符证书已经生效.如下图所示:
–
通配符证书自动续期
letsencrypt的通配符证书的有效期同样为90天.但是通配符的自动续约比较复杂.因为需要人工配置DNS记录来验证域名控制权,所以不能像单域名证书一样使用certbot工具来自动续约了.
不过好在网络上有很多大神写了一些比较优秀的脚本工具来通过调用DNS解析运营商的API接口实现自动配置DNS记录.收集了2个作者的脚本来实现自动续期:
–
本文大部分知识点来自于:https://www.jianshu.com/p/c5c9d071e395
非常感谢原文作者!