免费的SSL证书,国内的阿里、腾讯等云服务商都有提供,但是他们的证书都只是免费一年,而且不支持免费的通配符证书,收费的证书至少都是1k/年以上,对于个人用户肯定是承受不了的,幸好我们还有Let’s Encrypt。通过Let's Encrypt
申请的证书,虽然有效期只有90天,但是我们可以通过工具自动续期,并且它支持免费的通配符证书,也就是说我们只需要申请一个证书,就可以应用在多个Web应用上了。
Let's Encrypt
是一个于2015年三季度推出的数字证书认证机构 ,旨在以自动化流程消除手动创建和安装证书的复杂流程,并推广使万维网服务器的加密连接无所不在,为安全网站提供免费的传输层安全性协议(TLS)证书。Let's Encrypt
得到了 Mozilla、Cisco、Akamai、Electronic Frontier Foundation 和 Chrome 等众多公司和机构的支持,发展十分迅猛。
网上有不少使用基于Let's Encrypt
脚本来创建证书的文章,不过目测大部分都有文章都有一定的历史了,本文是按照官网的步骤一步步来配置的,可以说是全网最新的了。
部署环境
- DNS提供商:阿里云
- 服务器:CentOS Linux release 8.4.2105
- 证书类型:DV SSL证书,通配符证书
关于证书类型的知识可参考:cloud.tencent.com/developer/articl...
安装 snap
snap
就像是你手机上的应用市场,通过它你可以很方便的为Linux安装、管理系统上的应用。稍后我们会使用snap
来安装certbot
。
添加EPEL
库
$ sudo dnf install epel-release
$ sudo dnf upgrade
安装snapd
yum install snapd
启用管理snap通信套接字的Systemd unit
$ sudo systemctl enable --now snapd.socket
启用经典snap支持
$ sudo ln -s /var/lib/snapd/snap /snap
安装 Certbot
Certbot是一个免费开源的工具,它可以帮助我们申请和更新Let's Encrypt
的证书。
将snapd
更新到最新版
$ sudo snap install core; sudo snap refresh core
删除旧的certbot/certbot-auto的安装包
$ sudo dnf remove certbot
安装certbot
$ sudo snap install --classic certbot
链接certbot
命令
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
确认所安装的插件将具有与Certbot snap相同的经典包含性。(机翻,实在不知道是什么意思)
$ sudo snap set certbot trust-plugin-with-root=ok
生成证书
输入下面的命令生成*.xxx.com
这个泛域名的证书:
$ certbot certonly -d "*.xxx.com" --manual --preferred-challenges dns-01
参数解释:
certonly
- 获取或者更新一个证书,但是不要安装它。
-d "*.xxx.com"
- 你要获取证书的域名,多个域名以逗号分隔。
*
表示这是一个通配符域名。注意,通配符域名证书只能保护一个域名以及该域名的所有下一级域名,如果你要保护a.b.xxx.com
这样的二级域名,则需要再申请一个*.b.xxx.com
的通配符域名证书。 --manual
- 以交互方式或使用 shell 脚本勾子获取证书
--preferred-challenges dns-01
- 告诉
certbot
用什么样的方法来校验域名是属于你的,通配符域名只能使用dns-01
的方式,即在你的DNS提供商那里添加一个特定的TXT域名解析记录。
更多的命令参数参考:
certbot.eff.org/docs/using.html#ce...
敲击回车后,进入交互模式,这里需要你输入邮箱,确认一下协议,大致流程如下图(图片来源):
在生成证书的最后一步,命令行会提示你添加DNS TXT记录,这时先不要按回车键,在你的DNS提供商里为你的域名添加一个TXT解析记录,例如阿里云的:
添加完成后,等个10来秒,一般就生效了,这时回到命令行界面,按下回车键,检查证书是否生成成功。certbot
一般会将证书生成在/etc/letsencrypt/live/xxx.com/
这样的目录下。
更新证书
获取证书成功后,你可以使用下面的命令来尝试更新证书:
$ sudo certbot renew --dry-run
--dry-run
表示只是运行命令,并不真正执行更新操作,如无意外,你会看到下面的出错信息:
不用慌,这是正常现象,回想我们生成证书的步骤,在最后一步的校验中,需要我们在DNS提供商里面添加一个certbot
指定的TXT记录,但是certbot
并不知道我们DNS提供商的账号信息,自然不可能自动为我们添加了。错误信息里有一个关键的信息:
The error was: PluginError(‘An authentication script must be provided with –manual-auth-hook when using the manual plugin non-interactively.’)
它提示我们在非交互模式下,可以使用--manual-auth-hook
这个选项指定一个勾子脚本,在这个脚本里面完成添加TXT记录的操作。一般DNS提供商都有API提供给我们,我们可以自已写脚本调用API添加TXT记录,也可以使用github上的这个仓库
简单总结一下使用这个仓库更新证书的步骤
- 克隆代码
$ git clone https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au
- 配置根域名
- 查看
domain.ini
里面有没有你的根域名,如果没有的话,需要自行添加。 - 配置DNS API 密钥
- 去你的DNS提供商那里获取调用API所需的KEY和密钥,填写在
auth.sh
文件中 - 再次运行
$ certbot renew --manual-auth-hook "脚本目录/au.sh python aly add" --manual-cleanup-hook "脚本目录/au.sh python aly clean" --dry-run
--manual-cleanup-hook
这个选项是指定清理数据的脚本,这里这个脚本的作用是清除用作验证的TXT记录。注意这里面添加了--dry-run
选项,表示只是测试更新流程是否正确,并不是真的更新证书。- 定时更新证书
- 成功使用脚本更新证书后,我们可以在
crontab
中添加一个定时任务,来实现自动更新证书的任务,这样就可以一劳永逸,不用担心证书会失效了。编辑crontab
,添加以下任务:
# 证书有效期小于30天才会renew,所以crontab可以配置为1天或1周
1 1 */1 * * certbot renew --manual-auth-hook "脚本目录/au.sh python aly add" --manual-cleanup-hook "脚本目录/au.sh python aly clean"