HTTPS配置優化及註意點
Nginx官網反向代理時配置SSL證書,需要enable ngx_http_ssl_module模塊,且需要支持的openssl開發版,默認配置參數比較少,但是可以根據實際情況對性能及安全性做成優化,具體如下!
一、SSL參數具體優化(這裏只填主要的)
1. ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1;
蘋果APP只支持TLSv1.2,會優先使用TLSv1.2,考慮到客戶端兼容性,其他2各也加上
2. ssl_certificate_key ssl/minminmsn.comsha256.key;
私鑰,服務器加密使用
3. ssl_certificate ssl/minminmsn.comsha256.crt;
證書,客戶端解密使用,服務器證書和中間證書合並到一個文件,不需要根證書;另外1.7.3版本增加了新指令ssl_password_file可以支持帶密碼的私鑰
4. ssl_session_cache shared:SSL:10m;
會耗費一部分內存,1m可以同時保存4000個會話,10m理論支持4萬個會話,註意這個改動後需要重啟 nginx才會生效,nginx啟動時會申請資源,一般分配後比較難修改,內存空間不足時老的會話自動清理用於新的會話
5. ssl_session_timeout 60m;
考慮到APP操作習慣及安全性暫定60分鐘,這個默認5分鐘,一般為30分鐘到4小時,如果是網頁形式可以時間更長一般不超過24小時,多了有安全隱患
6. ssl_prefer_server_ciphers on;
讓服務器選擇要使用的算法套件,這樣避免客戶端選擇低安全的算法造成***
7. ssl_ciphers (共18個,ECDHE、DHE、AES開頭個6個)
"ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4 ";
這18個算法是通過TLS版本和考慮到安全和性能及各種客戶端兼容性默認選擇ECDHE-RSA-AES128-GCM-SHA256,另外向哪些已經確認不安全的算法(如MD5、RC4、DES)會直接拒絕防止***根據客戶端兼容性來降級安全算法,這裏是安全和性能的核心,需要長期關註定期更新。另外特別註意的是HTTPS裏面耗時的有兩個地方一個是網絡方面的RTT就是延時,一個是密鑰交換優化需要在這兩個地方下功夫
二、重點註意事項
1. SHA256簽名算法支持最少XPSP3和Android2.3版本
2. 服務器密碼套件配置優先,這樣更安全
3. AES可以和GCM已驗證套件一起使用,建議TLS協議中只使用GCM套件,不使用CBC套件
4. 前向保密 ECDHE套件
5. 性能GCM套件是最快的
6. SNI服務器名稱指示,2006年後才加入TLS中,支持一個IP綁定多個域名,但是域名過多,證書也會變大,通配域名理論上不能超過上百域名;另外SNI有的客戶端不支持例如IE7.0以下、Windows XP、Mac OS版要求最低X 10.5.6,早期Android版本,Nginx 0.5.32及後續版本,Openssl0.98f(0.98j開始默認支持SNI)
7. 會話緩存,例如一個小時,Twitter為例,12小時會更新一次密鑰36小時候刪除
8. 分布式會話緩存,https使用ip_hash,保證同一個用戶始終分配到統一服務器上
9. Cookie安全問題
10. HSTS可以解決不安全到Cookie,HTTPS stripping***,相同網站內的混合內容問題。HSTS可以禁止瀏覽器使用無效證書。最好效果是包括子域名
11. CSP,允許網站控制在HTML頁面中嵌入的資源用什麽協議來對抗XSS***
12. Openssl 1.0.1版本後開始支持,協議降級保護,使用Openssl最新庫,性能明顯優化,但是也不能盲目升級1.0.1版本後才出現心臟出血漏洞,1.0.2版本後會輸出密鑰強度,系統自帶Openssl-1.0.1e版本,官網Openssl三大版本最新版本1.1.0c、1.0.2j、1.0.1u
13. 2010 Google數據TLS計算只占CPU負載的不到1%,每個連接只占不到10KB的內存,以及不到2%的網絡開銷
14. initcwnd初始擁塞窗口調優ip route change 59.151.116.115 route change initcwnd 10
15. net.ipv4.tcp_slow_start_after_idle = 0 改成0防止空閑時慢啟動,HTTP長連接
16. 保持TCP連接時間越長,傳輸越快,有了長連接,可以最小化TLS開銷,同時也提高了TCP性能。HTTP/1.1默認開啟保持活動狀態(keep-alive)
17. SNI 機制,解決server 單ip支持多host https
18. 盡早完成握手,cdn與客戶端建立tls
19. 讓服務器支持HTTP/2,Nginx 的版本需要大於1.9.5,同時OpenSSL的版本需要大於1.0.2j
20. Nginx不會對反向代理的後端做證書驗證,當後端服務器是公網服務器就會有安全缺陷,Nginx 1.8.x版本後支持後端證書驗證
21. 線上Tengine2.1.0版本(Nginx1.6.2),線上Tengine2.2.0版本(Nginx1.8.1)支持HTTP2.0,新版本出來20來天等穩定一段時間後再升級
22. HTTPS總共需要三個往返(TCP一個,TLS二個),RTT大約30毫秒的用戶,HTTPS大約需要90毫秒完成連接建立,RTT要是比較大,這個建立連接的時間將會大得多
23. TLS建立連接的耗時對比:直接TLS連接設置3*90ms=270ms,通過CDN進行的TLS連接設置(使用連接池)3*5ms=15ms 用戶到CDN節點RTT 5ms,CDN節點到服務器RTT 85ms,RTT為聯合往返時間
24. TLS最大的成本除了延遲以外,就是用於安全參數協商的CPU密集型加密操作,即密鑰交換,而密鑰交換的CPU消耗很大程度上取決於服務器選擇的私鑰算法、密鑰長度和密鑰交換算法建議使用這個TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256(百度,京東,阿裏都是這個),由於按照服務器端優先級為準,這個算法應放在ssl_ciphers:ECDHE-RSA-AES128-GCM-SHA256第一位
25. 證書鏈裏證書越少越好,這樣速度更快、
26. TLS回使DsS***更加容易成本更低,安全風險少量的可以限制連接,大量的需要資源超配或第三方援助才行
27. HSTS考慮到客戶端兼容性和目前沒有全部域名HTTPS,現在沒有開啟,後續再開啟
28. 默認站點可以對不正確域名的請求返回錯誤消息listen 443 ssl default_server;不需要配置server_name,所有未匹配的請求都會進入默認站點server_name “”;
29. 服務器集群且不希望部署共享票證密鑰時,可以ssl_session_tickets off;這個從1.5.9版本開始支持,默認不配置就行集群總體上會話票證弊大於利
30. Http轉Https最節省資源的配置方法 return https://$host$request_uri;
31. TLS緩沖區調優ssl_buffer_size默認16KB,減少TLS緩沖區大小,可以顯著減少首字節時間例如配置1400字節,註意會降低吞吐量,訪問量大且數據為圖片等大數據時的域名不需要降低
32. TLS使用情況監控日誌可以加變量$ssl_session_reused(1.5.10後支持),根據會話恢復率可以了解TLS會話緩存的工作性能,並設置TLS日誌格式
33. log_format ssl “$time_local $server_name $remote_addr $connection $connection_requests $ssl_protocol $ssl_cipher $ssl_session_id $ssl_session_reused”;
34. Ssl日誌位置也分開 access_log /data/ssllog/dom
HTTPS配置優化及註意點