Tinko·Secret Base

Stop talking about that

Tinko

@Tinko3周前

09/7
22:46
地大七八事

certbot指定监听地址的正确姿势

在本菜鸡从学校毕业之前(你终于毕业了啊?),学校网络中心的老师决定搭一个内网专用的 git 服务器,于是本菜鸡高高兴兴接了锅。但是这个需求就有点6了:

  1. 仅限校园网内网访问
  2. 没了

反正学校有防火墙嘛对不对, IPv4 妥妥的只有内网能进,外网都是白名单准入,根本不用多做操作。于是我就开始搭服务器, Ubuntu Server 18.04 ,Gitea ,Openresty 一套带走。

正当我美滋滋准备收工的时候,我发现一个很大的问题:

  1. Git 不弄 HTTPS 还是 git 么?肯定得弄啊对不对
  2. 所以我跟网络中心的 DNS 管理发过了请求,同时解析 A 和 AAAA 记录, AAAA 是为了能让 Let’s Encrypt 的 ACME Challege 成功访问到本机,不受防火墙阻拦,保证能够成功申请 HTTPS 证书
  3. 学校的 HTTPS 证书只有几个外包项目在用,内部根本不会用这个证书,老师们觉得 3 年换一次证书贼烦,于是就没给我,而且是赛门铁克的证书,让我用我也不用
  4. (关键) 由于各家浏览器啊操作系统啊的策略,在有 IPv6 可用的情况下是会优先走 IPv6 的,而在这一情况下, IPv6 上不能提供网页访问和 Git 服务,因为一旦在 IPv6 上提供服务,意味着全球都能访问了 (不要跟我说限制客户端 IP ,我懒)

于是这个 Git 服务器的需求分析之后就变成了:

如何在

搭建一个只允许 IPv4 访问的网页服务器

同时

通过 IPv6 签发 Let’s Encrypt 证书

同时不因 IPv6 优先策略影响服务可用性

所以综上分析,不难推出一个大概的设定:

  1. 网页服务器 (此处为 Openresty) 不能监听 IPv6 ,不然会导致访问异常
  2. 从 1 推出,不能使用网页服务器提供 .well-known 的访问
  3. Certbot 不能尝试监听 IPv4 ,何况它也绑不上端口

于是这里就进行了如下操作:

  1. 正常配置仅 IPv4 的整套服务器
  2. 保证网页服务器正常工作仅监听 IPv4 地址的 80 和 443 ,启动 Certbot Standalone 模式

很显然, Certbot 会直接报出无法绑定地址监听端口的问题,于是在某搜索引擎搜了半天,找到一个方案:

/etc/letsencrypt/cli.ini 写入一行配置:

http-01-address = [IPv6 address]

然后尝试签发,诶成功,美滋滋,配好 cron 之后 dry run 一次,完美,走人。

可是在我走之后两个月,也就是前几天,我收到 Let’s Encrypt 的邮件,说我这个域名的 SSL 证书 renew 失败。我正纳闷着为啥失败,手动跑一次,这辣鸡 Certbot 又在尝试绑 IPv4 端口。回去配置文件一看,上面那行还在啊,咋回事啊( ・ˍ・)

然后我跑去官网查手册,这时候就出来另一个信息:域名配置文件 /etc/letsencrypt/renewal/[domain].conf 内的 [renewalparams] 段下面有个可用的选项叫做 standalone-supported-challenges ,参数为 http-01 ,同时在这个段里面还有一个 http01_address 选项,这两个选项联合使用来指定具体绑定到哪个地址上。

在写好两个参数之后重新执行 renew 操作就正常了,由于是更改配置文件设置,这样也不需要重写 cron 或者其它的什么东西,至于会不会再次失效,嗯至少现在 dry run 是没什么问题了的,如果还有什么问题的话我会再 po 上来。

certbot指定监听地址的正确姿势