HTTPS 站中的幾大難題nginx
性能,包括:git
其次,兼容性及周邊,如:github
如何解決算法
關注安全與兼容性apache
其次是一篇關於 Nginx 中 SSL 性能優化的文章《Nginx SSL 性能優化》。瀏覽器
密鑰交換算法緩存
常見的密鑰交換算法有 RSA,ECDHE,DH,DHE 等算法。它們的特性以下:安全
建議優先支持 RSA 和 ECDH_RSA 密鑰交換算法。緣由是:性能優化
更改其配置以下(參照 Nginx Performance Tuning for SSL( http://dojo.techsamurais.com/?p=1384 ):服務器
1
2
3
4
5
|
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
|
或者
1
|
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-RC4-SHA:!ECDHE-RSA-RC4-SHA:ECDH-ECDSA-RC4-SHA:ECDH-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:!RC4-SHA:HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!CBC:!EDH:!kEDH:!PSK:!SRP:!kECDH;
|
(禁用了RC4,sha1,MD5等算法)
輔助加速
啓用SPDY
SPDY 是 Google 推出的優化 HTTP 傳輸效率的協議( https://www.chromium.org/spdy ), 它基本上沿用了 HTTP 協議的語義, 可是經過使用幀控制實現了多個特性,顯著提高了 HTTP 協議的傳輸效率。
SPDY 最大的特性就是多路複用,能將多個 HTTP 請求在同一個鏈接上一塊兒發出去,不像目前的 HTTP 協議同樣,只能串行地逐個發送請求。
能夠在編譯Nginx帶上參數 –with-http_spdy_module 支持 SPDY 協議,而後可在配置中啓用:
1
|
listen 443 ssl spdy;
|
檢測是否使用SPDY的網址( https://spdycheck.org/ )
HSTS
HSTS(HTTP Strict Transport Security)。服務端返回一個 HSTS 的 http header,瀏覽器獲取到 HSTS 頭部以後,在一段時間內,無論用戶輸入 www.baidu.com 仍是 http://www.baidu.com ,都會默認將請求內部跳轉成 https://www.baidu.com;
將下述行添加到你的 HTTPS 配置的 server 塊中:
1
|
add_header Strict-Transport-Security "max-age=31536000";
|
Session cache
Session cache 的原理是使用 client hello 中的 session id 查詢服務端的 session cache, 若是服務端有對應的緩存,則直接使用已有的 session 信息提早完成握手,稱爲簡化握手。
Session cache 有兩個缺點:
Session cache 也有一個很是大的優勢:session id 是 TLS 協議的標準字段,市面上的瀏覽器所有都支持 session cache。
1
2
|
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 20m;
|
參照 Nginx 的官方文檔 1MB 內存大約能夠存儲 4000 個 session,按例配置 20M 大約能夠存儲 80000。根據需求合理設置。
Ocsp stapling
Ocsp 全稱在線證書狀態檢查協議 (rfc6960),用來向 CA 站點查詢證書狀態,好比是否撤銷。一般狀況下,瀏覽器使用 OCSP 協議發起查詢請求,CA 返回證書狀態內容,而後瀏覽器接受證書是否可信的狀態。 將證書保存下來,瀏覽器請求時候直接經過本身的服務器發送回去,防止驗證服務器出問題,還能加快訪問速度。
查看OSCP驗證服務器地址:
1
|
openssl x509 -in 1_test.qupeiyin.net_bundle.crt -text
|
在輸出的文字中找到 OCSP - URI: ,後面的 URL 就是 OSCP 的驗證服務器地址。
請求 OSCP 證書
1
2
3
4
|
openssl ocsp -noverify \
-issuer /certificate-path/trustchain.crt \
-cert /certificate-path/trustchain.crt \
|
不出意外會收到以下的結果
1
2
3
|
trustchain.crt: good
This Update: Oct 18 17:59:10 2014 GMT
Next Update: Oct 18 23:59:10 2014 GMT
|
若是出現 403 錯誤,那就須要在 Header 請求頭加上域名參數如 -header 「HOST」 「ocsp2.globalsign.com」 ,沒問題後就能夠直接保存下來證書文件,完整的命令以下:
1
2
3
4
|
openssl
ocsp -noverify -issuer 1_root_bundle.crt
-cert 1_root_bundle.crt -url http://ocsp1.wosign.com/ca6/server1 -header "HOST"
"ocsp1.wosign.com" -text -respout ./stapling_file.ocsp
|
將保存下來的 stapling_file.ocsp 證書添加到 nginx 的配置中,以下,Nginx 中配置變成了這樣子:
1
2
3
4
|
ssl_stapling on;
ssl_stapling_verify on;
ssl_stapling_file /stapling_file.ocsp;
ssl_trusted_certificate /certificate-path/trustchain.crt;
|
這樣子重啓 Nginx 後就會生效,可使用下面的命令測試生效結果:
1
|
echo QUIT | openssl s_client -connect blog.alphatr.com:443 -status 2> /dev/null | grep -A 17 'OCSP response:' | grep -B 17 'Next Update'
|
看到 OCSP Response Status: successful 這樣的字樣就是成功了。
ocsp證書有效期很短,大概不到一個月,因此過段時間要更新 ocsp 證書,否則仍是會驗證失敗。須要用腳本定時更新OCSP證書。
總結:(所有優化參數)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
ssl on;
ssl_certificate /data/www/ssl/ssl.crt;
ssl_certificate_key /data/www/ssl/ssl.key;
ssl_trusted_certificate /data/www/ssl/trustchain.crt;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
resolver 223.5.5.5 223.6.6.6 valid=300s;
resolver_timeout 10s;
error_page 497 https://$host$request_uri;
|
參數詳解:
ssl on 開啓SSL
ssl_certificate 對應單張證書
ssl_certificate_key 對應私鑰
ssl_trusted_certificate 對應信任鏈(即Startcom SSL或者Positive SSL中須要附加到單張證書後面的那兩張證書,能夠獨立出來)
ssl_protocols 支持的SSL協議標準(nginx默認參數爲:ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;)
ssl_ciphers (nginx默認參數爲:ssl_ciphers HIGH:!aNULL:!MD5;)
ssl_prefer_server_ciphers On; 指定服務器密碼算法在優先於客戶端密碼算法時,使用SSLv3和TLS協議。
error_page 497 https://$host$request_uri; 經過497錯誤將http轉跳到https