
@Tinko4年前
在本菜鸡从学校毕业之前(你终于毕业了啊?),学校网络中心的老师决定搭一个内网专用的 git
服务器,于是本菜鸡高高兴兴接了锅。但是这个需求就有点6了:
- 仅限校园网内网访问
- 没了
反正学校有防火墙嘛对不对, IPv4 妥妥的只有内网能进,外网都是白名单准入,根本不用多做操作。于是我就开始搭服务器, Ubuntu Server 18.04 ,Gitea ,Openresty 一套带走。
正当我美滋滋准备收工的时候,我发现一个很大的问题:
- Git 不弄 HTTPS 还是 git 么?肯定得弄啊对不对
- 所以我跟网络中心的 DNS 管理发过了请求,同时解析 A 和 AAAA 记录, AAAA 是为了能让 Let’s Encrypt 的 ACME Challege 成功访问到本机,不受防火墙阻拦,保证能够成功申请 HTTPS 证书
- 学校的 HTTPS 证书只有几个外包项目在用,内部根本不会用这个证书,老师们觉得 3 年换一次证书贼烦,于是就没给我,而且是赛门铁克的证书,让我用我也不用
- (关键) 由于各家浏览器啊操作系统啊的策略,在有 IPv6 可用的情况下是会优先走 IPv6 的,而在这一情况下, IPv6 上不能提供网页访问和 Git 服务,因为一旦在 IPv6 上提供服务,意味着全球都能访问了 (不要跟我说限制客户端 IP ,我懒)
于是这个 Git 服务器的需求分析之后就变成了:
如何在
搭建一个只允许 IPv4 访问的网页服务器
的同时
通过 IPv6 签发 Let’s Encrypt 证书
同时不因 IPv6 优先策略影响服务可用性
所以综上分析,不难推出一个大概的设定:
- 网页服务器 (此处为 Openresty) 不能监听 IPv6 ,不然会导致访问异常
- 从 1 推出,不能使用网页服务器提供 .well-known 的访问
- Certbot 不能尝试监听 IPv4 ,何况它也绑不上端口
于是这里就进行了如下操作:
- 正常配置仅 IPv4 的整套服务器
- 保证网页服务器正常工作仅监听 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 上来。