Let's Encrypt 手动模式:泛域名 SSL 证书的免费解决方案

您所在的位置:网站首页 letsencrypt证书申请 Let's Encrypt 手动模式:泛域名 SSL 证书的免费解决方案

Let's Encrypt 手动模式:泛域名 SSL 证书的免费解决方案

2023-11-09 13:42| 来源: 网络整理| 查看: 265

随着 HTTPS 的普及,越来越多的浏览器,第三方服务要求我们的服务器启用 HTTPS。而高昂的证书费用和免费证书繁琐的申请过程对于个人开发者和开源项目,则是一个沉重的负担。若不启用 HTTPS,用户在浏览我们的网页时也会收到各种警告,用户体验非常不好。

而 Let's Encrypt 这个非盈利,开源的 SSL 证书提供商,则为许多开发者缓解了这个问题。并且它提供了各类自动签发,更新证书的方式,包括 Node.js,Nginx 的插件等等,并且鼓励我们使用他们的自动更新功能。但是,为什么我们还要来使用它的手动模式呢?让我们来看看 Let's Encrypt 官网的说法:

显然,中国的云服务提供商由于合规等等原因,不太乐意(或说不太允许)接入 Let's Encrypt 的自动服务,那么如果我们使用了云服务厂商的各种 FaaS 服务(例如 Serverless 能力),在没有命令行访问权限的时候,我们自然无法利用 Let's Encrypt 的自动更新能力了。

但是,大家可能会担心 Let's Encrypt 手动模式会非常麻烦,还不如利用其他的免费的证书。但一般来说,免费证书只支持单个(子)域名,且一般只能申请一个。而 Let's Encrypt 的免费证书支持申请泛域名证书,如果有多个服务都在一个域名下,则会方便很多。当然,需要注意的是,这样我们的证书每三个月都需要进行手动 renew,还是不如一般付费泛域名证书方便的。

安装 Certbot

certbot 是 Let's Encrypt 用于签发证书的命令行工具,我们需要 certbot 来进行证书的申请和更新。

这里我们在 Docker 中使用 certbot,这是因为:

certbot 本身只支持 unix 操作系统(Windows 无法直接使用) 在 linux 下通过 snap 安装时国内速度较慢,甚至无法使用,而 snap 不支持更换镜像源

首先,我们需要安装 Docker 和 Docker Compose,如何安装可以参考这里

安装完成后,我们首先创建一个工作目录,这样我们的证书就会生成到这个目录下

mkdir certbot

在这个目录下我们创建一个 docker-compose.yml 文件,具体内容如下:

# docker-compose.yml version: '3.9' services: certbot: image: certbot/certbot # 使用 certbot 镜像 tty: true stdin_open: true volumes: - ./letsencrypt/etc:/etc/letsencrypt # 将获取的证书导出到容器外的工作文件夹 - ./letsencrypt/lib:/var/lib/letsencrypt entrypoint: "/bin/sh" # 必须使用 entrypoint 而不是 command, 以重写 certbot image 的 entrypoint

完成后,在工作目录下我们就可以启用这个容器啦,这里我们需要使用 docker-compose run certbot 以便在交互模式下启用服务:

docker-compose run certbot

上一行命令运行后,完成镜像拉取,容器运行后,我们就进入了容器的交互终端,可以使用 certbot 了。

测试签发证书

进入 certbot 容器的交互终端后,在其中输入以下命令,开始手动模式证书的签发:

certbot certonly -a manual --dry-run

需要注意的是,我们现在加入了 --dry-run 指令,这样我们在签发时其实用的是 Let's Encrypt 的 Staging Environment,并不会真正签发。这是因为 Let's Encrypt 是有速率限制的,并且还比较严格,如果没有准备好就直接开始签发,可能尝试几次失败后我们就必须等很长一段时间才能签发。

Let's Encrypt 会询问我们要签发证书的域名:

Please enter in your domain name(s) (comma and/or space separated) (Enter 'c' to cancel):

如果我们只要签发一个子域名的证书,例如 one.example.com,直接输入即可。如果我们希望多个子域名都能共有一个证书(例如 a.example.com, b.example.com 都共用一个证书),我们则需要写入 *.example.com。

输入域名后,会显示下面的信息,这是 Let's Encrypt 要通过 ACME Challenge 验证我们的域名:

ACME Challenge

具体的,在为我们签发证书之前,Let's Encrypt 需要我们证明具有域名的所有权,这也就是 ACME Challenge。

值得一提的是,虽然 Let's Encrypt 官方说明上说需要 DNS 服务商支持 DNS Challenge 才有意义,但实际上在手动模式上并不重要,因为我们手动设置完成 Challenge,更新证书即可。

我们在手动模式下使用的是 DNS-01 Challenge,具体的,这种验证方式要求我们在域名的 TXT 记录中放置特定值来证明我们能修改域名的 DNS 解析,证明我们控制该域名。

具体来说,对于上面的 Challenge 信息,Let's Encrypt 要求我们将 ESUo7e2EDAnpLRU25UtfVMPCDLZZRFI9KfU3tG4jjLU 这个随机字符串,作为 TXT 解析记录,放置到我们域名的 _acme-challenge 子域名下:

这样,Let's Encrypt 通过查看我们域名的 DNS 记录,自然就可以验证我们对域名的所有权了。

完成 DNS 的配置后,我们才能按下回车,让 Let's Encrypt 验证配置是否生效,需要注意的是,有的 DNS 服务商生效并没有那么快,certbot 会提示我们进行验证,我们可以通过谷歌管理员工具箱进行验证。

如果在 Staging Environment 环境下成功完成了以上流程(没有报错),我们就可以开始正式签发了:

正式签发证书

正式签发除了没有 --dry-run 之外,和 Staging Environment 下的签发类似:

certbot certonly -a manual

正式签发时,certbot 还会询问我们的邮箱,以便发送安全和更新相关的信息,其他过程都是一样的。

最后,签发完成后,在项目文件夹的 ./letsencrypt/etc/live/ 文件夹下,我们就可以看到签发完成的证书了:

现在,README 下有对这几个文件作用的具体说明,我们可以根据服务配置的需求,使用这些私钥和证书咯:

This directory contains your keys and certificates. `privkey.pem` : the private key for your certificate. `fullchain.pem`: the certificate file used in most server software. `chain.pem` : used for OCSP stapling in Nginx >=1.3.7. `cert.pem` : will break many server configurations, and should not be used without reading further documentation (see link below). WARNING: DO NOT MOVE OR RENAME THESE FILES! Certbot expects these files to remain in this location in order to function properly! We recommend not moving these files. For more information, see the Certbot User Guide at https://certbot.eff.org/docs/using.html#where-are-my-certificates. 参考资料 Let's Encrypt 官方文档 Docker - Install Docker Engine Certbot - User Guide


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3