nginx ssl配置
1. 全站ssl
全站做ssl是最常見的一個使用場景,預設埠443,而且一般是單向認證。
server {
listen 443;
server_name example.com;
root /apps/www;
index index.html index.htm;
ssl on;
ssl_certificate ../SSL/ittest.pem;
ssl_certificate_key ../SSL/ittest.key;
# ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# ssl_prefer_server_ciphers on;
}
如果想把http的請求強制轉到https的話:
server {
listen 80;
server_name example.me;
rewrite ^ https://$server_name$request_uri? permanent;
### 使用return的效率會更高
# return 301 https://$server_name$request_uri;
}
ssl_certificate
證書其實是個公鑰,它會被髮送到連線伺服器的每個客戶端,ssl_certificate_key
私鑰是用來解密的,所以它的許可權要得到保護但nginx的主程序能夠讀取。當然私鑰和證書可以放在一個證書檔案中,這種方式也只有公鑰證書才傳送到client。
ssl_protocols
指令用於啟動特定的加密協議,nginx在1.1.13和1.0.12版本後預設是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2
,TLSv1.1與TLSv1.2要確保OpenSSL >= 1.0.1 ,SSLv3 現在還有很多地方在用但有不少被攻擊的漏洞。
ssl_ciphers
openssl -v cipher 'RC4:HIGH:!aNULL:!MD5'
(後面是你所指定的套件加密演算法) 來看所支援演算法。ssl_prefer_server_ciphers on
設定協商加密演算法時,優先使用我們服務端的加密套件,而不是客戶端瀏覽器的加密套件。
https優化引數
ssl_session_cache shared:SSL:10m;
: 設定ssl/tls會話快取的型別和大小。如果設定了這個引數一般是shared
,buildin
可能會引數記憶體碎片,預設是none
,和off
差不多,停用快取。如shared:SSL:10m
表示我所有的nginx工作程序共享ssl會話快取,官網介紹說1M可以存放約4000個sessions。 詳細參考serverfault上的問答ssl_session_cache。ssl_session_timeout
: 客戶端可以重用會話快取中ssl引數的過期時間,內網系統預設5分鐘太短了,可以設成30m
即30分鐘甚至4h
。
設定較長的keepalive_timeout
也可以減少請求ssl會話協商的開銷,但同時得考慮執行緒的併發數了。
提示:在生成證書請求csr檔案時,如果輸入了密碼,nginx每次啟動時都會提示輸入這個密碼,可以使用私鑰來生成解密後的key來代替,效果是一樣的,達到免密碼重啟的效果:
HTTPS伺服器優化
SSL操作需要消耗CPU資源,所以在多處理器的系統,需要啟動多個工作程序,而且數量需要不少於可用CPU的個數。最消耗CPU資源的SSL操作是SSL握手,有兩種方法可以將每個客戶端的握手運算元量降到最低:第一種是保持客戶端長連線,在一個SSL連線傳送多個請求,第二種是在併發的連線或者後續的連線中重用SSL會話引數,這樣可以避免SSL握手的操作。會話快取用於儲存SSL會話,這些快取在工作程序間共享,可以使用ssl_session_cache指令進行配置。1M快取可以存放大約4000個會話。預設的快取超時是5分鐘,可以使用ssl_session_timeout加大它。下面是一個針對4核系統的配置優化的例子,使用10M的共享會話快取:
worker_processes 4; http { ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; server { listen 443; server_name www.example.com; keepalive_timeout 70; ssl on; ssl_certificate www.example.com.crt; ssl_certificate_key www.example.com.key; ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; ...