Nginx HTTPS
阿新 • • 發佈:2020-12-13
一 HTTPS概述
1.1 HTTPS介紹
超文字傳輸安全協議HTTPS(Hypertext Transfer Protocol Secure)是超文字傳輸協議和SSL/TLS的組合,用以提供加密通訊及對網路伺服器身份的鑑定。 HTTPS也可以理解為HTTP over SSL,即HTTP連線建立在SSL安全連線之上。 HTTPS連線經常被用於全球資訊網上的交易支付和企業資訊系統中敏感資訊的傳輸。 注意:HTTPS與RFC 2660中定義的安全超文字傳輸協議(S-HTTP)不同。1.2 SSL介紹
SSL(Secure Socket Layer)安全套接字層是一種數字證書,它使用ssl協議在瀏覽器和web server之間建立一條安全通道,資料資訊在client與server之間的安全傳輸。SSL使用證書來建立安全連線,通常有兩種驗證模式:- 僅客戶端驗證伺服器的證書,客戶端自己不提供證書;
- 客戶端和伺服器都互相驗證對方的證書。
二 自簽名證書
2.1 自簽名證書
SSL需要使用TLS證書對通訊進行加密,通常可通過openssl工具生產自建證書。2.2 openssl建立證書
1 [root@nginx01 ~]# openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/C=CN/ST=ZheJiang/L=HangZhou/O=Xianghy/OU=Web Security/CN=tls.linuxds.com"
三 免費證書申請
3.1 騰訊雲申請
騰訊提供免費一年的SSL證書申請,具體操作略。3.2 其他申請
免費證書也可通過:https://freessl.cn進行申請,具體操作略。四 配置SSL
4.1 配置語法
server { listen 443 ssl; #SSL 訪問埠號為 443 server_name www.xxx.com; #填寫繫結證書的域名 ssl_certificate tls.crt; #證書檔案 ssl_certificate_key tls.key; #私鑰檔案 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #請按照以下協議配置 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; #配置加密套件 ssl_prefer_server_ciphers on; #依賴SSLv3和TLSv1協議的伺服器密碼將優先於客戶端密碼; ssl_session_timeout 5m; #會話過期時間; ssl_session_cache shared:SSL:1m; #儲存SSL會話的快取型別和大小; location / { root /web/www/website/dist; #定義首頁索引檔案的名稱 index index.html; }
4.2 配置示例
1 [root@nginx01 ~]# mkdir /usr/share/nginx/tls/ 2 [root@nginx01 ~]# echo '<h1>WebTLS</h1>' > /usr/share/nginx/tls/index.html
4.3 配置虛擬主機
1 [root@nginx01 ~]# mkdir -p /etc/nginx/tls 2 [root@nginx01 ~]# ll /etc/nginx/tls/ 3 total 8.0K 4 -rw-r--r-- 1 root root 3.7K Jul 5 22:07 linuxds.crt 5 -rw-r--r-- 1 root root 1.7K Jul 5 22:07 linuxds.key
[root@nginx01 ~]# vi /etc/nginx/conf.d/tls.conf server { listen 443 ssl; server_name tls.linuxds.com; root /usr/share/nginx/tls/; access_log /var/log/nginx/tls.access.log main; error_log /var/log/nginx/tls.error.log warn; ssl_certificate /etc/nginx/tls/linuxds.crt; ssl_certificate_key /etc/nginx/tls/linuxds.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_prefer_server_ciphers on; ssl_session_timeout 5m; ssl_session_cache shared:SSL:1m; location / { index index.html index.htm; } } server { listen 80; server_name tls.linuxds.com; rewrite ^(.*) https://$host$1 permanent; }提示:如上http自動調整https也可如下寫法:
1 server { 2 listen 80; 3 server_name tls.linuxds.com; #填寫繫結證書的域名 4 return 301 https://$host$request_uri; #把http的域名請求轉成https 5 }
1 [root@nginx01 ~]# nginx -t -c /etc/nginx/nginx.conf #檢查配置檔案 2 [root@nginx01 ~]# nginx -s reload #過載配置檔案
4.4 確認驗證
瀏覽器訪問:http://tls.linuxds.com,觀察是否自動調整至https://tls.linuxds.com。 參考官網:http://nginx.org/en/docs/http/configuring_https_servers.html。五 HTTPS其他優化
5.1 優化CPU消耗
SSL 的運算需要消耗額外的 CPU 資源,一般多核處理器系統會執行多個工作程序(worker processes ),程序的數量不會少於可用的 CPU 核數。SSL 通訊過程中【握手】階段的運算最佔用 CPU 資源,通常有兩個方法可以減少每臺客戶端的運算量:- 啟用 keepalive 長連線,一個連線傳送更多個請求;
- 複用 SSL 會話引數,在並行併發的連線數中避免進行多次 SSL【握手】。
server { …… ssl_session_timeout 10m; #配置會話超時時間 ssl_session_cache shared:SSL:10m; #配置共享會話快取大小,視站點訪問情況設定 keepalive_timeout 70; #設定長連線 …… }
5.2 使用HSTS優化安全性
HSTS:HTTP Strict Transport Security,HTTP嚴格傳輸安全。它允許一個 HTTPS 網站要求瀏覽器總是通過 HTTPS 來訪問,這使得攻擊者在使用者與伺服器通訊過程中攔截、篡改資訊以及冒充身份變得更為困難。 示例:server { …… add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; …… }釋義: max-age:設定單位時間內強制使用 HTTPS 連線; includeSubDomains:可選,所有子域同時生效; preload:可選,非規範值,用於定義使用【HSTS 預載入列表】 always:可選,保證所有響應都發送此響應頭,包括各種內建錯誤響應。 瀏覽器在獲取該響應頭後,在 max-age 的時間內,如果遇到 HTTP 連線,就會通過 307 跳轉強制使用 HTTPS 進行連線,並忽略其它的跳轉設定(如 301 重定向跳轉)
5.3 提升演算法優化安全性
HTTPS 基礎配置採取的預設加密演算法是 SHA-1,這個演算法非常脆弱,安全性逐步降低,因此建議重要的 HTTPS 配置方案應該避免 SHA-1,可以使用 迪菲-赫爾曼金鑰交換(D-H,Diffie–Hellman key exchange)方案。- 生產dhparam.pem檔案
1 [root@nginx01 ~]# cd /etc/nginx/tls 2 [root@nginx01 tls]# openssl dhparam -out dhparam.pem 2048
- 配置Nginx採用的演算法
[root@nginx01 tls~]# server { …… ssl_prefer_server_ciphers on; #優先採取伺服器演算法 ssl_dhparam /etc/nginx/tls/dhparam.pem; #使用DH檔案 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"; #定義演算法 …… }
5.4 其他安全優化
通常Nginx要可以配合如下安全引數來提升安全性。{ …… add_header X-Frame-Options DENY; #減少點選劫持 add_header X-Content-Type-Options nosniff; #禁止伺服器自動解析資源型別 add_header X-Xss-Protection 1; #防止XSS攻擊 …… }
5.5 優化總結示例
使用相應優化後的配置如下:1 [root@nginx01 ~]# cd /etc/nginx/tls 2 [root@nginx01 tls]# openssl dhparam -out dhparam.pem 2048
[root@nginx01 tls]# vi /etc/nginx/conf.d/tls.conf server { listen 443 ssl; server_name tls.linuxds.com; root /usr/share/nginx/tls/; access_log /var/log/nginx/tls.access.log main; error_log /var/log/nginx/tls.error.log warn; ssl_certificate /etc/nginx/tls/linuxds.crt; ssl_certificate_key /etc/nginx/tls/linuxds.key; ssl_session_timeout 10m; #配置會話超時時間 ssl_session_cache shared:SSL:10m; #配置共享會話快取大小 keepalive_timeout 70; #配置長連線 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; #HSTS策略 add_header X-Frame-Options DENY; #減少點選劫持 add_header X-Content-Type-Options nosniff; #禁止伺服器自動解析資源型別 add_header X-Xss-Protection 1; #防止XSS攻擊 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; #優先採取伺服器演算法 ssl_dhparam /etc/nginx/tls/dhparam.pem; #使用DH檔案 ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"; #定義演算法 location / { index index.html index.htm; } } server { listen 80; server_name tls.linuxds.com; rewrite ^(.*) https://$host$1 permanent; }
1 [root@nginx01 ~]# nginx -t -c /etc/nginx/nginx.conf #檢查配置檔案 2 [root@nginx01 ~]# nginx -s reload #過載配置檔案瀏覽器訪問:http://tls.linuxds.com,觀察響應頭資訊。 參考:https://aotu.io/notes/2016/08/16/nginx-https/index.html。 https://imququ.com/post/web-security-and-response-header.html