Nginx 教程(3):SSL 設置

SSL 和 TLS

 

SSL(Socket Secure Layer 縮寫)是一種經過 HTTP 提供安全鏈接的協議。nginx

 

SSL 1.0 由 Netscape 開發,但因爲嚴重的安全漏洞從未公開發布過。SSL 2.0 於 1995 年發佈,它存在一些問題,致使了最終的 SSL 3.0 在 1996 年發佈。web

 

TLS(Transport Layer Security 縮寫)的第一個版本是做爲 SSL 3.0 的升級版而編寫的。以後 TLS 1.1 和 1.2 出來了。如今,就在不久以後,TLS 1.3 即將推出(這確實值得期待),而且已經被一些瀏覽器所支持。瀏覽器

 

從技術上講,SSL 和 TLS 是不一樣的(由於每一個協議都描述了協議的不一樣版本),但其中使用的許多名稱是能夠互換的。緩存

 

基本 SSL/TLS 配置

 

爲了處理 HTTPS 流量,你須要具備 SSL/TLS 證書。你能夠經過使用 Let’s encrypt 以生成免費的證書。安全

 

當你擁有證書以後,你能夠經過如下的方式輕易切換至 HTTPS:服務器

 

  • 開始監聽端口 443(當你輸入 https://sample.co 時瀏覽器將使用的默認端口)session

  • 提供證書及其密鑰dom

 

server {測試

  listen 443 ssl default_server;ui

  listen [::]:443 ssl default_server;

 

  ssl_certificate /etc/nginx/ssl/netguru.crt;

  ssl_certificate_key /etc/nginx/ssl/netguru.key;

}

 

咱們也想經過調整配置實現:

 

  • 僅使用 TLS 協議。因爲衆所周知的漏洞,全部的 SSL 版本都將再也不使用

  • 使用預約義的安全的服務器密碼(相似於協議的狀況 – 那些日子只有少數密碼被認爲是安全的)

 

請牢記,上述設置老是在變化的。時不時從新更新是個好主意。

 

ssl_protocols TLSv1 TLSv1.TLSv1.2;

ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:!MD5;

ssl_prefer_server_ciphers on;

 

server {

  listen 443 ssl default_server;

  listen [::]:443 ssl default_server;

 

  ssl_certificate /etc/nginx/ssl/netguru.crt;

  ssl_certificate_key /etc/nginx/ssl/netguru.key;

}

 

TLS 會話恢復

 

使用 HTTPS,在 TCP 之上須要增長 TLS 握手。這大大增長了此前實際數據傳輸的時間。假設你從華沙請求 /image.jpg,並接入到柏林最近的服務器:

爲了在 TLS 握手期間節省一個 roundtrip 時間,以及生成新密鑰的計算開銷,咱們能夠重用在第一個請求期間生成的會話參數。客戶端和服務器能夠將會話參數存儲在會話 ID 密鑰的後面。在接下來的 TLS 握手過程當中,客戶端能夠發送會話 ID,若是服務器在緩存中仍然有正確的條目,那麼會重用前一個會話所生成的參數。

 

server {

    ssl_session_cache shared:SSL:10m;

    ssl_session_timeout 1h;

}

 

OCSP Stapling

 

SSL 證書能夠隨時撤銷。瀏覽器爲了知道給定的證書是否再也不有效,須要經過在線證書狀態協議 (Online Certificate Status Protocol ,OCSP) 執行額外的查詢。無需用戶執行指定的 OCSP 查詢,咱們能夠在服務器上執行此操做,緩存其結果,並在 TLS 握手期間爲客戶端提供 OCSP 響應。它被稱爲OCSP stapling。

 

server {

  ssl_stapling on;

  ssl_stapling_verify on;                               # verify OCSP response

  ssl_trusted_certificate /etc/nginx/ssl/lemonfrog.pem# tell nginx location of all intermediate certificates

 

  resolver 8.8.8.8 8.8.4.4 valid=86400s;                # resolution of the OCSP responder hostname

  resolver_timeout 5s;

}

 

Security headers

 

有一些標頭確實值得調整以提供更高的安全性。有關更多關於標頭及其詳細信息,你絕對應該查看OWASP 項目之安全標頭。

 

HTTP Strict-Transport-Security

 

或簡稱 HSTS,強制用戶代理在向源發送請求時使用 HTTPS。

 

add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";

 

X-Frame-Options

 

表示瀏覽器是否須要在一幀、一個 iframe 或一個對象標籤中渲染頁面。

 

add_header X-Frame-Options DENY;

 

X-Content-Type-Options

 

此選項將阻止瀏覽器在判斷文件類型時嗅探文件。文件將會按照 Content-Type 頭中聲明的格式轉譯。

 

add_header X-Content-Type-Options nosniff;

 

Server tokens

 

另外一個很好的作法是在 HTTP 響應頭字段中隱藏有關 Web 服務器的信息:

 

Server : nginx/1.13.2

 

實現此功能能夠經過禁用 server_tokens 指令:

 

server_tokens off;

 

附錄 :: Let’s Encrypt

 

安裝

 

最新的安裝包能夠在這裏找到。

 

爲了測試使用暫存環境,不排除速率限制。

 

生成新證書

 

certbot certonly --webroot --webroot-path /var/www/netguru/current/public/  

          -foo.netguru.co 

          -bar.netguru.co

 

確保可以正確更新。

 

certbot renew --dry-run

 

確保你在 crontab 添加了自動更新。運行 crontab -e,同時添加下邊一行代碼

 

 3 * * * /usr/bin/certbot renew --quiet --renew-hook "/usr/sbin/nginx -s reload"

 

檢查 SSL 是否可以經過 ssllabs 正常運行。

相關文章
相關標籤/搜索