Nginx 編譯最新的 SSL(Chacha20-Poly1305),解決 Google Chomre 淘汰 SPDY 改用 HTTP/2 的問題

2016-11-10 Nginx

在今年六月,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 全部都不支援。

alpn_support

 

目前有支援 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 分享出來使用

Github: nginxauto

 

在這個專案裡面提供了 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

使用 BoringSSL 优化 HTTPS 加密算法选择

 

 

給 Mr. 沙先生一點建議

彙整

分類

展開全部 | 收合全部

License

訂閱 Mr. 沙先生 的文章

輸入你的 email 用於訂閱