近两年追 Web 新特性,像 HTTP/2、TLS 1.3,刚好网站现在又是运行在 VPS 上的(而不是虚拟主机),相关组件都能自己定制。尝试过几个 Nginx、OpenSSL 相关的补丁(patch),本来想单独好好介绍一番,拖到现在,不如总结成简短一篇,聊胜于无。
这些补丁主要是有关 SPDY 和 chacha20 加密算法的。注意应当只用于测试,不要用于正式环境。
兼容 SPDY
SPDY 协议是 HTTP/2 的前身。Nginx 在支持 HTTP/2 后移除了 SPDY 特性。为了让一些老旧浏览器(主要是旧版 Chrome)也获得比 HTTP 1.1 更快的速度,我当时用了这个补丁。
但是注意,这个补丁可能会造成一些隐蔽的问题。比如造成 iOS QQ 内置浏览器 AJAX 失效。
兼容 old chacha
openssl__chacha20_poly1305_draft_and_rfc_ossl102j.patch
openssl__1.1.0_chacha20_poly1305.patch
chacha20 是 Google 开发的流式加密算法,在嵌入式设备如手机上替代 AES,能取得更快的加解密速度。OpenSSL 支持的是正式版的 chacha20 算法。但一部分旧版 Chrome 内核(尤其是 Android 的内置浏览器)只支持草案(draft)版本的 chacha20,称为 old chacha。为 OpenSSL 打上这个补丁可以同时支持新旧两种算法。
优先使用 chacha20
nginx_auto_using_PRIORITIZE_CHACHA.patch
Chrome 客户端会判断用户硬件是否支持 AES-NI,如果不,发送的 cipher 中会将 chacha20 的 cipher(如 TLS_CHACHA20_POLY1305_SHA256)排在前。服务端可以感受这种优先顺序。一种方法是将 ssl_prefer_server_ciphers
设为 off
,这样会遵守客户端顺序,但不被安全指南推荐,因为在很多其他旧版浏览器中会损失安全性。因而通常要开启 ssl_prefer_server_ciphers
,这个补丁在这种场景下还能优先根据客户端顺序使用(或不使用)chacha20 系列 cipher。注意对 Firefox 无效。
这个补丁是给 Nginx 的。我看了源码,很简单,是利用了新版 Nginx 本身的特性。我还用过另一种版本,给 OpenSSL 的补丁,一时半会翻不到,也不是那么推荐,就不列出了。