《HTTP/3 浅尝辄止》

763 次点基 | 还木有吐槽
2020-09-15

前段时间无意听闻 HTTP/3 这个东西,本着我可以不懂,但我不能没有的精神,打算将主页和博客升级为支持 HTTP/3 协议,但由于诸事缠身便搁浅了,碰巧这两天空闲了下来,立马捣鼓了起来。

大致面对 Google 学习了一番,得知 HTTP/3 使用的是基于 UDP 的 QUIC 协议,我们目前所接触的 HTTP/1.0、HTTP/1.1 以及 HTTP/2 都是基于 TCP 协议的,然后 Google 的网站已经在许多年前就支持 QUIC 协议了。至于这些英文都是什么意思,有什么作用我就没怎么深入了,只知道 3 肯定比 2 大,三块钱肯定比两块钱值钱。

然后呢,目前应该有两种比较流行的方案可以实现 HTTP/3 ,第一种是 Nginx 的官方分支 Nginx-QUIC + BoringSSL,第二种是 Nginx 1.19 + Cloudflare quiche 补丁 + BoringSSL。我寻思着我不是主页和博客都搞吗,正好一边搞一种方案。

因为之前编译 Nginx 使用的是 OpenSSL,不怎么情愿切换到 BoringSSL ,但现在 OpenSSL 并不支持 HTTP/3 ,并且在博客里明说了直到 OpenSSL 3.0 发布前都不会考虑支持(虽然现在已经有一个处于 WIP 状态的 PR 了)。大致看了一下,好像有几个分支已经在支持 QUIC 的路上了,比如来自 Akamai 的 OpenSSL 分支以及来自 tatsuhiro-t 的 OpenSSL 分支。试着分别编译了一下,很好,都报错了,看了一下日志,嗯……看不懂,果断放弃使用 OpenSSL。

换了 BoringSSL,跟着教程,编译一路顺畅,腾讯云安全组开放 UDP 443 端口访问,修改 Nginx.conf 添加 HTTP/3 监听,docker-compose.yml 映射 UDP 443 端口,一顿操作之后 docker-compose up,很好,Nginx 进程没掉;Chrome Flags 开启实验性 QUIC 协议,试着访问一下主页,很好,能访问;控制台看一下网络,很好,协议已经显示为 H3-29 了。至此,主页和博客升级 HTTP/3 完毕,本文到此结束。

Docker 镜像
Chrome 控制台

……

要是人生有这么一帆风顺就好了。

但是现实嘛,不踩几个坑是不可能的。

Chrome 是能访问了,换了 Firefox 试一下,好家伙,直接就给我来个 REQUIRED_TLS_FEATURE_MISSING 错误,连页面都打不开了。试着搜索一下这串英文,得知可能和 OCSP Must Staple 有关,WTF is OCSP?有点印象,记得好像确实有捣鼓过这玩意。向 Google 老师请教了一下,发现了一个关键词 BoringSSL,难道和这货有关?果不其然,Google 老师跟我说,BoringSSL 啊,它不支持 OCSP。OK、OK,完了,搞砸了。继续向 Google 老师讨教,发现已经有大神提供了解决方案,感谢大神 kn007。

向 Nginx 打了大神提供的 patch,再次编译 Nginx 后再根据大神的教程尝试输入代码更新 OCSP stapling file,然后……这 TM 怎么卡着不动了?看了一下代码,发现一个网址:ocsp.int-x3.letsencrypt.org,试着 curl 一下,不动,用 Chrome 访问,转圈圈,ShadowsocksR 全局模式,连通了。好家伙,原来是墙太高了,咋办,又向 Google 老师请教,得到了一条 host,添加进 /etc/hosts 后保存再次更新 OCSP stapling file,成了,再次用 Firefox 访问主页,可以访问了。

本想着这事终告一段落了,最后进 HTTP/3 Check 这个网站想测一下 HTTP/3 连通性,然后新的问题接踵而至,测试返回了 Bad status code from server,再测了几次,还是相同的错误。看了一下 Nginx 日志,发现测试请求返回了 403 错误码,但是用浏览器啊、curl 啊这些却能正确返回 200,顿时感到纳闷,究竟是什么东西让 Nginx 返回了 403 错误码?想了一下午没想明白,顿生怒气,狂按 F5,突然页面返回了一串 JSON,看到了熟悉的 403 字眼。

脑子灵光一闪,这不是 VeryNginx 返回的吗,难道测试的时候也是 VeryNginx 搞的鬼?半信半疑地进 VeryNginx 把会返回 403 的设置全部关了后再测试了一次,然后测试通过了……WTM 直接就 WTM 了,挨个排查,终于找到了罪魁祸首,关闭这设置后就完事了。

Fin
留下吐槽?
刷卡上车
私密吐槽
loading