英文:netguru,翻譯:開源中國翻譯
www.oschina.net/translate/nginx-tutorial-ssl-setup
大家好!分享即關懷,我們很樂意與你分享其他的一些知識。我們準備了一個 Nginx 指南,分為三個系列。如果你已經知道一些 Nginx 知識或者想擴充套件你的經驗和認知,這個再合適不過了。
我們將告訴你 Nginx 的運作樣式、蘊含的概念,怎樣透過調優 Nginx 來提高應用效能,或是如何設定它的啟動和執行。
這個教程有三個部分:
-
基本概念 —— 這部分需要去瞭解 Nginx 的一些指令和使用場景,繼承模型,以及 Nginx 如何選擇 server 塊,location 的順序。
-
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,並接入到柏林最近的伺服器:
為了在 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 essay-headers
有一些標頭確實值得調整以提供更高的安全性。有關更多關於標頭及其詳細資訊,你絕對應該檢視OWASP 專案之安全標頭。
HTTP Strict-Transport-Security
或簡稱 HSTS,強制使用者代理在向源傳送請求時使用 HTTPS。
add_essay-header Strict-Transport-Security “max-age=31536000; includeSubdomains; preload”;
X-Frame-Options
表示瀏覽器是否需要在一幀、一個 iframe 或一個物件標簽中渲染頁面。
add_essay-header X-Frame-Options DENY;
X-Content-Type-Options
此選項將阻止瀏覽器在判斷檔案型別時嗅探檔案。檔案將會按照 Content-Type 頭中宣告的格式轉譯。
add_essay-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 正常執行。
系列文章
●本文編號447,以後想閱讀這篇文章直接輸入614即可
●輸入m獲取到文章目錄
駭客技術與網路安全
更多推薦《18個技術類公眾微信》
涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。