2016年11月10日 星期四

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

在今年六月,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 加密算法选择,正常狀況下是由伺服器選擇客戶端的加密形式,但 ChaCha20 則是可以讓瀏覽器有彈性的調整想要走的安全加密形式

 

上述這三種 SSL 各有優缺點

  • LibreSSL 針對 OpenSSL 進行全面重構,更為輕量,但目前(2.4.2)尚未支援「等價加密組」。

  • OpenSSL 相較於其他為老牌的 SSL,但因為長期累月的維護越來越肥大,相對問題也多,由於使用的人數眾多,如有重大 Bug 也較容易受重視,支援「等價加密組」。

  • BoringSSL 不支援 OCSP Stapling,由於 Google 工程師說這是有漏洞的!相對的 Chrome 也不支援 OCSP,支援「等價加密組」。


 

 

NginxAuto Patch SSL

針對如何編譯 ChaCha20-Poly1305 小弟已經有寫在 Github 分享出來使用

Github: auto-install

 

在這個專案裡面提供了 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;128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

 

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 加密算法选择

 

 

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

沒有留言:

張貼留言