標籤:

Nginx 教程 #3:SSL 設置

大家好!分享即關懷,我們很樂意與你分享其他的一些知識。我們準備了一個 Nginx 指南,分為三個系列。如果你已經知道一些 Nginx 知識或者想擴展你的經驗和認知,這個再合適不過了。

我們將告訴你 Nginx 的運作模式、蘊含的概念,怎樣通過調優 Nginx 來提高應用性能,或是如何設置它的啟動和運行。

這個教程有三個部分:

  • 基本概念 —— 這部分需要去了解 Nginx 的一些指令和使用場景,繼承模型,以及 Nginx 如何選擇 server 塊,location 的順序。
  • 性能 —— 介紹改善 Nginx 速度的方法和技巧,我們會在這裡談及 gzip 壓縮,緩存,buffer 和超時。
  • SSL 安裝 —— 如何配置伺服器使用 HTTPS

創建這個系列,我們希望,一是作為參考書,可以通過快速查找到相關問題(比如 gzip 壓縮,SSL 等)的解決方式,也可以直接通讀全文。為了獲得更好的學習效果,我們建議你在本機安裝 Nginx 並且嘗試進行實踐。

SSL 和 TLS

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

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

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 時瀏覽器將使用的默認埠)
  • 提供證書及其密鑰

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 協議。由於眾所周知的漏洞,所有的 SSL 版本都將不再使用
  • 使用預定義的安全的伺服器密碼(類似於協議的情況 - 那些日子只有少數密碼被認為是安全的)

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

ssl_protocols TLSv1 TLSv1.1 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,並接入到柏林最近的伺服器:

Open connectionTCP Handshake:Warsaw ->------------------ synchronize packet (SYN) ----------------->- BerlinWarsaw -<--------- synchronise-acknowledgement packet (SYN-ACK) ------<- BerlinWarsaw ->------------------- acknowledgement (ACK) ------------------->- BerlinTLS Handshake:Warsaw ->------------------------ Client Hello ---------------------->- BerlinWarsaw -<------------------ Server Hello + Certificate ---------------<- BerlinWarsaw ->---------------------- Change Ciper Spec -------------------->- BerlinWarsaw -<---------------------- Change Ciper Spec --------------------<- BerlinData transfer:Warsaw ->---------------------- /image.jpg --------------------------->- BerlinWarsaw -<--------------------- (image data) --------------------------<- BerlinClose connection

為了在 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/ -d foo.netguru.co -d 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 正常運行。

總結

感謝您的閱讀。如果沒有大量的資源,這個系列是不可能完成的。在這一系列的寫作中,我們發現了一些特別有用的網站:

  • nginx 文檔
  • nginx 博客
  • udemy(在線教育網站 )的 nginx 原理
  • Ilya Grigorik 的博客,和他的令人驚奇的書:《高性能瀏覽器網路》
  • Martin Fjordvald 的博客

Nginx 教程 #1:基本概念

Nginx 教程 #2:性能

原 文:Nginx Tutorial #3: SSL Setup

譯 文:開源中國社區

作 者:Tocy, 局長, madbooker, 南宮冰郁, AsyDong 譯

更多文章:SDK.CN - 中國領先的開發者服務平台

熱門資訊

  • Nginx 教程 #3:SSL 設置
  • 快速開啟你的第一個項目:TensorFlow項目架構模板
  • Python 的 with 語句
  • 「ICO 融資輪」將成為常態
  • GitHub引入聯合提交者

推薦閱讀:

在印象筆記中可以安全的保存很私密的信息嗎?
酷站推薦 - ssllabs.com/ssl-pulse - SSL/TLS Security Scan Summary
為什麼你不應該安裝12306的證書
TLS完全指南(零)
上經過ssl加密的網站,為什麼有的顯示公司名,有的不顯示?

TAG:Nginx | SSL |