在今年六月,Google Chrome 51 淘汰了 SPDY/NPN 的支援,並且改採用 HTTP/2 與 ALPN
SPDY 為一個 Open Source 的專案,主要是用來改善在網頁傳輸的延遲增加了 55 % 的下載速度,但隨著 HTTP 協定的演進 Google Chrome 開始支援 HTTP/2 並且放棄 SPDY/NPN。
也就是說,即使你使用了 SPDY 也不再受到 Chrome 的支援,也不會使用 HTTP/2 的協定,但是 OpenSSL 在 1.0.2 later 才開始支援 ALPN,最瞎的是目前幾乎所有發行版本內建的 OpenSSL 全部都不支援。
目前有支援 HTTP/2 ALPN 的 SSL 有以下
- OpenSSL:patch from Cloudflare
- LibreSSL :maintains from OpenBSD
- BoringSSL:maintains from Google
這幾種 SSL 都支援最新的 Chacha20-Poly1305,其中裡面還有一個名為「等價加密算法組」可以讓客戶端自行選擇最安全的加密形式;
在中國有一位JerryQu的一篇文章描述得非常詳細 使用 BoringSSL 优化 HTTPS 加密算法选择,正常狀況下是由伺服器選擇客戶端的加密形式,但 「等價加密算法組」則是可以讓瀏覽器有彈性的調整想要走的安全加密形式
上述這三種 SSL 各有優缺點
- LibreSSL 針對 OpenSSL 進行全面重構,更為輕量,但目前(2.4.2)尚未支援「等價加密組」。
- OpenSSL 相較於其他為老牌的 SSL,但因為長期累月的維護越來越肥大,相對問題也多,由於使用的人數眾多,如有重大 Bug 也較容易受重視,支援「等價加密組」。
- BoringSSL 不支援 OCSP Stapling,由於 Google 工程師說這是有漏洞的!相對的 Chrome 也不支援 OCSP,支援「等價加密組」。
NginxAuto Patch SSL
針對如何編譯 ChaCha20-Poly1305 小弟已經有寫在 Github 分享出來使用
在這個專案裡面提供了 OpenSSL(Cloudflare) / LibreSSL / BoringSSL 三種 SSL 自行選用,全面使用源始碼重新編譯,並且加入許多安全參數
$ git clone https://github.com/shazi7804/auto-install $ cd auto-install/nginx $ chmod +x nginx-auto.sh # 加入你想要的 SSL 參數, 範例 Boringssl $ ./nginx-auto.sh install --boringssl
「等價加密算法組」的設定
BoringSSL:
ssl_ciphers [ECDHE-ECDSA-AES128-GCM-SHA256|ECDHE-ECDSA-CHACHA20-POLY1305]:[ECDHE-RSA-AES128-GCM-SHA256|ECDHE-RSA-CHACHA20-POLY1305]:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:DES-CBC3-SHA;
OpenSSL/LibreSSL:
ssl_cipers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
在 Nginx 設定,以 BoringSSL 為例
# Enable CHACHA20_POLY1305 Encryption on http or server ssl_prefer_server_ciphers on; ssl_ciphers [ECDHE-ECDSA-AES128-GCM-SHA256|ECDHE-ECDSA-CHACHA20-POLY1305]:[ECDHE-RSA-AES128-GCM-SHA256|ECDHE-RSA-CHACHA20-POLY1305]:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:DES-CBC3-SHA;128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; $ vim /etc/nginx/conf.d/server.conf server { listen 443 ssl http2; server_name example.com; // ...
參考資料:
Supporting HTTP/2 for Google Chrome Users