016.Nginx HTTPS

来源:https://www.cnblogs.com/itzgr/archive/2020/07/21/13354364.html
-Advertisement-
Play Games

一 HTTPS概述 1.1 HTTPS介紹 超文本傳輸安全協議HTTPS(Hypertext Transfer Protocol Secure)是超文本傳輸協議和SSL/TLS的組合,用以提供加密通訊及對網路伺服器身份的鑒定。 HTTPS也可以理解為HTTP over SSL,即HTTP連接建立在S ...


一 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使用證書來創建安全連接,通常有兩種驗證模式:
  • 僅客戶端驗證伺服器的證書,客戶端自己不提供證書;
  • 客戶端和伺服器都互相驗證對方的證書。
註意:編譯安裝的Nginx預設情況下ssl模塊並未被安裝,如果要使用該模塊則需要在編譯nginx時指定–with-http_ssl_module參數。

二 自簽名證書

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"
釋義: -days 36500:證書有效期,100年; -newkey rsa:2048:同時產生一個新證書和一個新的SSL key(加密強度為RSA 2048); -keyout:SSL輸出文件名; -out:證書生成文件名; C:使用國際標準組織(ISO)國碼格式,填寫2個字母的國家代號,中國請填寫CN; ST:省份,比如填ZheJiang; L:城市,比如填寫HangZhou; O:組織單位,比如填寫公司名稱的拼音; OU:部門; CN:配置 SSL 加密的網站地址。 提示:可自建泛功能變數名稱的證書,如*.linuxds.com。

三 免費證書申請

3.1 騰訊雲申請

騰訊提供免費一年的SSL證書申請,具體操作略。

3.2 其他申請

免費證書也可通過:https://freessl.cn進行申請,具體操作略。

四 配置SSL

4.1 配置語法

  1 server {
  2     listen 443 ssl;				        #SSL 訪問埠號為 443
  3     server_name www.xxx.com;			#填寫綁定證書的功能變數名稱
  4     ssl_certificate tls.crt;			#證書文件
  5     ssl_certificate_key tls.key;		        #私鑰文件
  6     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;	        #請按照以下協議配置
  7     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;	#配置加密套件
  8     ssl_prefer_server_ciphers on;		        #依賴SSLv3和TLSv1協議的伺服器密碼將優先於客戶端密碼;
  9     ssl_session_timeout 5m;			        #會話過期時間;
 10     ssl_session_cache   shared:SSL:1m;		#儲存SSL會話的緩存類型和大小;
 11 location / {
 12     root /web/www/website/dist;			#定義首頁索引文件的名稱
 13     index index.html;
 14 }

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
  1 [root@nginx01 ~]# vi /etc/nginx/conf.d/tls.conf
  2 server {
  3     listen 443 ssl;
  4     server_name          tls.linuxds.com;
  5     root   /usr/share/nginx/tls/;
  6     access_log  /var/log/nginx/tls.access.log  main;
  7     error_log   /var/log/nginx/tls.error.log  warn;
  8     ssl_certificate      /etc/nginx/tls/linuxds.crt;
  9     ssl_certificate_key  /etc/nginx/tls/linuxds.key;
 10     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 11     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
 12     ssl_prefer_server_ciphers on;
 13     ssl_session_timeout  5m;
 14     ssl_session_cache   shared:SSL:1m;
 15     location / {
 16         index  index.html index.htm;
 17     }
 18 }
 19 server
 20 {
 21     listen 80;
 22     server_name tls.linuxds.com;
 23     rewrite ^(.*) https://$host$1 permanent;
 24 }
提示:如上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。 clipboard 參考官網:http://nginx.org/en/docs/http/configuring_https_servers.html。

五 HTTPS其他優化

5.1 優化CPU消耗

SSL 的運算需要消耗額外的 CPU 資源,一般多核處理器系統會運行多個工作進程(worker processes ),進程的數量不會少於可用的 CPU 核數。SSL 通訊過程中【握手】階段的運算最占用 CPU 資源,通常有兩個方法可以減少每台客戶端的運算量:
  • 激活 keepalive 長連接,一個連接發送更多個請求;
  • 復用 SSL 會話參數,在並行併發的連接數中避免進行多次 SSL【握手】。
這些會話會存儲在一個 SSL 會話緩存裡面,通過命令 ssl_session_cache 配置,可以使緩存在機器間共用,然後利用客戶端在【握手【階段使用的 seesion id 去查詢服務端的 session cathe(如果服務端設置有的話),簡化【握手】階段。 1M 的會話緩存大概包含 4000 個會話,預設的緩存超時時間為 5 分鐘,可以通過使用ssl_session_timeout 命令設置緩存超時時間。 示例:
  1 server
  2 {
  3 ……
  4     ssl_session_timeout  10m;				#配置會話超時時間
  5     ssl_session_cache   shared:SSL:10m;			#配置共用會話緩存大小,視站點訪問情況設定
  6     keepalive_timeout   70;				#設置長連接
  7 ……
  8 }

5.2 使用HSTS優化安全性

HSTS:HTTP Strict Transport Security,HTTP嚴格傳輸安全。它允許一個 HTTPS 網站要求瀏覽器總是通過 HTTPS 來訪問,這使得攻擊者在用戶與伺服器通訊過程中攔截、篡改信息以及冒充身份變得更為困難。 示例:
  1 server
  2 {
  3 ……
  4     add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
  5 ……
  6 }
釋義: 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)方案。
  1. 生產dhparam.pem文件
  1 [root@nginx01 ~]# cd /etc/nginx/tls
  2 [root@nginx01 tls]# openssl dhparam -out dhparam.pem 2048
  1. 配置Nginx採用的演算法
  1 [root@nginx01 tls~]# server
  2 {
  3 ……
  4     ssl_prefer_server_ciphers on;				#優先採取伺服器演算法
  5     ssl_dhparam /etc/nginx/tls/dhparam.pem;			#使用DH文件
  6     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  7     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";	#定義演算法
  8 ……
  9 }

5.4 其他安全優化

通常Nginx要可以配合如下安全參數來提升安全性。
  1 {
  2 ……
  3     add_header X-Frame-Options DENY;			#減少點擊劫持
  4     add_header X-Content-Type-Options nosniff;		#禁止伺服器自動解析資源類型
  5     add_header X-Xss-Protection 1;				#防止XSS攻擊
  6 ……
  7 }

5.5 優化總結示例

使用相應優化後的配置如下:
  1 [root@nginx01 ~]# cd /etc/nginx/tls
  2 [root@nginx01 tls]# openssl dhparam -out dhparam.pem 2048
  1 [root@nginx01 tls]# vi /etc/nginx/conf.d/tls.conf
  2 server {
  3     listen 443 ssl;
  4     server_name          tls.linuxds.com;
  5     root   /usr/share/nginx/tls/;
  6     access_log  /var/log/nginx/tls.access.log  main;
  7     error_log   /var/log/nginx/tls.error.log  warn;
  8     ssl_certificate      /etc/nginx/tls/linuxds.crt;
  9     ssl_certificate_key  /etc/nginx/tls/linuxds.key;
 10     ssl_session_timeout  10m;				#配置會話超時時間
 11     ssl_session_cache    shared:SSL:10m;			#配置共用會話緩存大小
 12     keepalive_timeout    70;				#配置長連接
 13     add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;								                #HSTS策略
 14     add_header X-Frame-Options DENY;			#減少點擊劫持
 15     add_header X-Content-Type-Options nosniff;		#禁止伺服器自動解析資源類型
 16     add_header X-Xss-Protection 1;				#防止XSS攻擊
 17     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 18     ssl_prefer_server_ciphers on;				#優先採取伺服器演算法
 19     ssl_dhparam /etc/nginx/tls/dhparam.pem;			#使用DH文件
 20     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";	#定義演算法
 21     location / {
 22         index  index.html index.htm;
 23     }
 24 }
 25 server
 26 {
 27     listen 80;
 28     server_name tls.linuxds.com;
 29     rewrite ^(.*) https://$host$1 permanent;
 30 }
  1 [root@nginx01 ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查配置文件
  2 [root@nginx01 ~]# nginx -s reload			#重載配置文件
瀏覽器訪問:http://tls.linuxds.com,觀察響應頭信息。 clipboard 參考:https://aotu.io/notes/2016/08/16/nginx-https/index.html。 https://imququ.com/post/web-security-and-response-header.html
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • static void Main(string[] args) { WebClientDownloadProgressChanged(); Console.ReadLine(); } static void WebClientDownloadProgressChanged() { string ur ...
  • JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。相對於另一種數據交換格式 XML,JSON 有著很多優點。例如易讀性更好,占用空間更少等。在 web 應用開發領域內,得益於 JavaScript 對 JSON 提供的良好支持,JSON 要比 XML 更受... ...
  • Linux 高分屏設置 有時候我們用Linux會發現4K解析度下屏幕字體特別小, 除了改變字體Size以外還有其他的設置可以嘗試. Gnome 系統設置 (Settings) - 顯示設置 (Displays) - 縮放 (Scale) : %200 使用 HighDPI-Fixer 編輯快捷方式 ...
  • CAN通信的調試不單是軟體上的調試,也需要對硬體進行檢查。原文鏈接:https://www.cnblogs.com/Cloudcan/p/13358095.html 在調通之前一直有兩個疑惑干擾判斷:(結論在文末)1.不同的CAN晶元是否存在不相容。2.不同型號的STM32是否CAN通信是否存在差異 ...
  • 前言:數據無價,謹慎操作! 前言:數據無價,謹慎操作! 前言:數據無價,謹慎操作! 前期環境 lsblk 查看磁碟情況和磁碟的分區 可以看到我們只有一塊硬碟 即sda 現在模擬真實環境 新增一塊硬碟 知識小課堂 - 什麼是LVM? 在擴容前,我們需要大概瞭解一下,什麼是PV、LV、VG,他們之間的聯 ...
  • HashMap源碼實現分析 一、前言 HashMap 顧名思義,就是用hash表的原理實現的Map介面容器對象,那什麼又是hash表呢。 我們對數組都很熟悉,數組是一個占用連續記憶體的數據結構,學過C的朋友對這一點影響肯定更為深刻。既然是一段連續的記憶體,數組的特點就顯而易見了,一旦你知道要查第幾個數據 ...
  • 因項目要求,需要佈署一個LINUX開發環境,所以在虛擬機中佈署一個ubuntu12.04和c#的開發環境,以下是折騰兩天時間搞定的流程,主要是開發環境MONO和MONODevelop比較耗時。 一、虛擬機安裝直接跳過,我安裝提虛擬機是VMware-workstation-full-15.5.1,安裝 ...
  • 本人純屬Windows用膩,後期請大佬多多指教 前面因為沒U盤而碰壁的內容在此不說,接下來因為太興奮,關於安裝U盤製作沒記錄什麼。 然後,經過一番折騰,分區問題解決了,但接下來卻······卡在寫盤! 最終決定虛擬機 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...