Let's Encrypt - 免费SSL/TLS证书用起来

网站优化/运营
499
0
0
2022-05-01
标签   SSL证书

免费的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脚本来创建证书的文章,不过目测大部分都有文章都有一定的历史了,本文是按照官网的步骤一步步来配置的,可以说是全网最新的了。:laughing:

部署环境

  • 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相同的经典包含性。(机翻,实在不知道是什么意思:innocent:)

$ 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...

敲击回车后,进入交互模式,这里需要你输入邮箱,确认一下协议,大致流程如下图(图片来源):

Let's Encrypt - 免费SSL/TLS证书用起来

在生成证书的最后一步,命令行会提示你添加DNS TXT记录,这时先不要按回车键,在你的DNS提供商里为你的域名添加一个TXT解析记录,例如阿里云的:

Let's Encrypt - 免费SSL/TLS证书用起来

添加完成后,等个10来秒,一般就生效了,这时回到命令行界面,按下回车键,检查证书是否生成成功。certbot一般会将证书生成在/etc/letsencrypt/live/xxx.com/这样的目录下。

更新证书

获取证书成功后,你可以使用下面的命令来尝试更新证书:

$ sudo certbot renew --dry-run

--dry-run表示只是运行命令,并不真正执行更新操作,如无意外,你会看到下面的出错信息:

Let's Encrypt - 免费SSL/TLS证书用起来

不用慌,这是正常现象,回想我们生成证书的步骤,在最后一步的校验中,需要我们在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"