1. 程式人生 > >nginx ssl配置

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庫能夠識別的寫法,你可以通過 openssl -v cipher 'RC4:HIGH:!aNULL:!MD5'(後面是你所指定的套件加密演算法) 來看所支援演算法。

ssl_prefer_server_ciphers on設定協商加密演算法時,優先使用我們服務端的加密套件,而不是客戶端瀏覽器的加密套件。

https優化引數

  • ssl_session_cache shared:SSL:10m; : 設定ssl/tls會話快取的型別和大小。如果設定了這個引數一般是sharedbuildin可能會引數記憶體碎片,預設是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;
        ...