深入理解HTTPS:從概念到實戰優化
- 一:概述
- 二:工作流程
- 三:創建自簽名證書
- 四:案例
- 1)案例一:HTTPS 搭建
- 2)案例二:HTTP/2 搭建
- 3)案例三:HTTP 重定向 HTTPS
- 4)案例四:網站集群 HTTPS 配置
- 五:優化
- 六:監控
- 1)監控思路
- 2)監控方式
- 3)監控腳本
- 總結
🌟 如果你對 HTTP 協議的基礎知識(如請求/響應報文、狀態碼等)還不熟悉,建議先閱讀:《HTTP協議完全指南:從報文到狀態碼》
一:概述
HTTPS = HTTP + TLS/SSL
在 HTTP 的基礎上,HTTPS 增加了加密和身份驗證,保障數據傳輸的安全性。
主要作用:
- 加密通信:防止數據在傳輸過程中被竊取或篡改
- 身份驗證:確認服務器身份,防止釣魚或中間人攻擊
- 數據完整性:確保數據在傳輸過程中未被修改
二:工作流程
HTTPS 基于 TLS(傳輸層安全協議),核心流程如下:
- 客戶端發起 HTTPS 請求
- 瀏覽器訪問
https://example.com
- 告訴服務器它支持的TLS版本和加密算法 + 一個隨機數
- 瀏覽器訪問
- 服務器返回證書
- 證書中包含公鑰、域名、頒發機構等信息 + 一個隨機數
- 客戶端驗證證書
- 檢查證書是否可信(CA 簽名、有效期、域名匹配)
- 生成會話密鑰
- 生成一個預密鑰,然后用服務器的公鑰加密后發給服務器,服務器用密鑰解密,然后將預密鑰和兩個隨機數組成對稱密鑰
- 加密通信
- 后續所有 HTTP 請求和響應 都用對稱密鑰加密傳輸
三:創建自簽名證書
.key
:私鑰
.csr
:申請證書的文件,交給CA(如果指定為自簽名證書-x509
則不生成)
.crt
:公鑰 + 證書
.pem
:公鑰 + 證書
-
一步到位
openssl req -days 365 -x509 -sha256 -nodes -newkey rsa:2048 \ -keyout server.key -out server.crt
-
分兩步
-
創建私鑰
openssl genrsa -out server.key 2048
-
根據私鑰生成證書
-days
:指定證書有效時間(單位:天)-x509
:直接生成自簽名證書(不用額外CSR
)-sha256
:簽名算法-key
:指定已有私鑰位置-out
:指定輸出證書文件位置
openssl req -days 365 -x509 -sha256 -key server.key -out server.crt
-
四:案例
1)案例一:HTTPS 搭建
-
創建存放
SSL
證書和私鑰的目錄[root@web01 ~]# mkdir -p /etc/nginx/ssl_keys
-
上傳證書
[root@web01 ~]# unzip /opt/software/ssl.jackmk.cn_nginx.zip -d /etc/nginx/ssl_keys/
-
創建站點
# 創建站點目錄 [root@web01 ~]# mkdir -p /opt/module/ssl# 創建站點 index.html [root@web01 ~]# echo "index" > /opt/module/ssl/index.html
-
創建站點配置文件
[root@web01 ~]# vim /etc/nginx/conf.d/ssl.conf
server {listen 443 ssl;# ssl on; # 1.15.0 以后被廢棄了server_name ssl.jackmk.cn;root /opt/module/ssl/;# ssl keyssl_certificate /etc/nginx/ssl_keys/ssl.jackmk.cn.pem;ssl_certificate_key /etc/nginx/ssl_keys/ssl.jackmk.cn.key;location / {index index.html;} }
-
刷新
Nginx
nginx -t nginx -s reload
-
配置
hosts
192.168.2.104 ssl.jackmk.cn
-
訪問
2)案例二:HTTP/2 搭建
server {listen 443 ssl http2; # 只要加上這個就行server_name ssl.jackmk.cn;root /opt/module/ssl/;# ssl keyssl_certificate /etc/nginx/ssl_keys/ssl.jackmk.cn.pem;ssl_certificate_key /etc/nginx/ssl_keys/ssl.jackmk.cn.key;location / {index index.html;}
}
3)案例三:HTTP 重定向 HTTPS
-
創建存放
SSL
證書和私鑰的目錄[root@web01 ~]# mkdir -p /etc/nginx/ssl_keys
-
上傳證書
ssl.jackmk.cn.key
:私鑰ssl.jackmk.cn.pem
:證書 + 公鑰
[root@web01 ~]# unzip /opt/software/ssl.jackmk.cn_nginx.zip -d /etc/nginx/ssl_keys/
-
創建站點
# 創建站點目錄 [root@web01 ~]# mkdir -p /opt/module/ssl# 創建站點 index.html [root@web01 ~]# echo "index" > /opt/module/ssl/index.html
-
創建站點配置文件
[root@web01 ~]# vim /etc/nginx/conf.d/ssl.conf
server {listen 80;server_name ssl.jackmk.cn;return 301 https://ssl.jackmk.cn$request_uri;#rewrite ^(.*)$ https://ssl.jackmk.cn$1 permanent; }server {listen 443 ssl;# ssl on; # 1.15.0 以后被廢棄了server_name ssl.jackmk.cn;root /opt/module/ssl/;# ssl keyssl_certificate /etc/nginx/ssl_keys/ssl.jackmk.cn.pem;ssl_certificate_key /etc/nginx/ssl_keys/ssl.jackmk.cn.key;location / {index index.html;} }
-
刷新
Nginx
[root@web01 ~]# nginx -t [root@web01 ~]# nginx -s reload
-
配置
hosts
192.168.2.104 ssl.jackmk.cn
-
訪問
此時如果請求 http://ssl.jackmk.cn 會自動跳轉至 http://ssl.jackmk.cn
4)案例四:網站集群 HTTPS 配置
1)部署 web01
、web02
-
創建存放
SSL
證書和私鑰的目錄mkdir -p /etc/nginx/ssl_keys
-
創建私鑰以及證書
# 1. 切換目錄 cd /etc/nginx/ssl_keys# 2. 創建私鑰 openssl genrsa -out ssl.key 2048# 3. 創建證書 openssl req -days 365 -x509 -sha256 -key ssl.key -out ssl.crt
-
創建站點
# 創建站點目錄 mkdir -p /opt/module/ssl# 創建站點 index.html echo "web01" > /opt/module/ssl/index.html or echo "web02" > /opt/module/ssl/index.html
-
創建站點配置文件
如果是
https -> http
那么就不需要配置ssl keys
vim /etc/nginx/conf.d/ssl.conf
server {listen 443 ssl;server_name ssl.cn;root /opt/module/ssl/;# ssl keysssl_certificate /etc/nginx/ssl_keys/ssl.crt;ssl_certificate_key /etc/nginx/ssl_keys/ssl.key;location / {index index.html;} }
-
刷新
Nginx
nginx -t nginx -s reload
2)部署 lb01
-
創建存放
SSL
證書和私鑰的目錄[root@lb01 ~]# mkdir -p /etc/nginx/ssl_keys
-
創建私鑰以及證書
# 1. 切換目錄 [root@lb01 ~]# cd /etc/nginx/ssl_keys# 2. 創建私鑰 [root@lb01 ssl_keys]# openssl genrsa -out ssl.key 2048# 3. 創建證書 [root@lb01 ssl_keys]# openssl req -days 365 -x509 -sha256 -key ssl.key -out ssl.crt
-
創建配置文件
[root@lb01 ~]# vim /etc/nginx/conf.d/ssl.conf
upstream ssl_pools {server 192.168.2.104:443;server 192.168.2.105:443; }server {listen 80;server_name ssl.cn;return 301 https://ssl.cn$request_uri; }server {listen 443 ssl;server_name ssl.cn;# ssl keysssl_certificate /etc/nginx/ssl_keys/ssl.crt;ssl_certificate_key /etc/nginx/ssl_keys/ssl.key;location / {proxy_pass https://ssl_pools;proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Real-Ip $remote_addr;} }
-
刷新
Nginx
[root@lb01 ~]# nginx -t [root@lb01 ~]# nginx -s reload
-
配置
hosts
192.168.2.102 ssl.cn
-
訪問
五:優化
主要是針對 SSL/TLS 加密連接做了一些安全和性能優化。
-
listen 443 ssl
- 作用:開啟 HTTPS 服務,監聽 443 端口,并啟用 SSL 模塊。(沒有這行,就算配了證書也不會啟用 HTTPS)
-
keepalive_timeout 70
-
作用:設置 長連接保持時間為 70 秒。
-
好處:
-
客戶端和服務端之間如果頻繁請求(比如網頁加載很多小文件),可以復用連接,減少握手開銷。
-
設置過短會導致頻繁握手,過長又會占用資源。70s 算是折中優化。
-
-
-
ssl_protocols TLSv1 TLSv1.1 TLSv1.2
-
作用:指定允許使用的 TLS 協議版本。
-
這里啟用了 TLSv1、TLSv1.1、TLSv1.2,但注意:
- TLSv1 和 TLSv1.1 已過時(安全性差),現代瀏覽器和安全規范(如 PCI DSS)都建議關閉。
- 最佳實踐是只保留 TLSv1.2+,甚至啟用 TLSv1.3(性能更好)
ssl_protocols TLSv1.2 TLSv1.3;
-
-
ssl_ciphers ...
- 作用:指定允許使用的加密算法套件。
- 配置里顯式排除了:
!aNULL
→ 禁止匿名算法!eNULL
→ 禁止無加密算法!EXPORT
→ 禁止出口級弱加密!DES
、!RC4
、!MD5
→ 禁止已知不安全的算法
-
ssl_certificate
/ssl_certificate_key
- 作用:指定服務器證書和私鑰。
cert.pem
→ 公鑰證書cert.key
→ 對應的私鑰
-
ssl_session_cache shared:SSL:10m
- 作用:配置 SSL 會話緩存。Nginx 在 10MB 的共享內存里存儲 SSL 會話信息。
- 好處:
- 客戶端下次訪問時可以復用會話,不必重新完整握手(節省 CPU 和握手延遲)。
- 10MB 大約能緩存 4 萬次會話(每個會話約 256B)。
-
ssl_session_timeout 10m
- 作用:設置 SSL 會話的過期時間(10 分鐘)。
- 好處:在這段時間內,同一個客戶端可以復用 TLS 會話,避免再次握手,提高性能。
server {listen 443 ssl;keepalive_timeout 70;ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5; ssl_certificate /usr/local/nginx/conf/cert.pem;ssl_certificate_key /usr/local/nginx/conf/cert.key;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;...
}
六:監控
主要針對 HTTPS 證書過期監控方案整理
1)監控思路
- 通過命令獲取證書的過期日期
- 將證書過期日期與當前日期對比
- 計算剩余天數(如小于 30 天報警)
2)監控方式
-
本地證書檢查
openssl x509
:調用openssl
的x509
子命令,主要用于 查看、轉換、管理 X.509 證書。-in
:指定輸入文件,也就是要讀取的證書文件。-noout
:默認openssl x509
會把證書的所有內容(包括公鑰、簽發者、使用者等)都打印出來。 加了-noout
表示 不要輸出證書本身的 Base64 內容,只輸出你后面指定的信息。-dates
:輸出證書的有效期信息:
openssl x509 -in /etc/nginx/ssl_keys/ssl.crt -noout -dates
notBefore=Aug 22 16:52:34 2025 GMT # 證書開始生效的時間 notAfter=Aug 22 16:52:34 2026 GMT # 證書過期的時間
-
curl
遠程監控curl -Lv https://www.baidu.com |& grep 'expire date'
3)監控腳本
-
檢查單個指定的網站的 HTTPS 證書過期時間
vim check_https_cert.sh chmod 755 check_https_cert.sh
#!/bin/bash#============================= # 1. 基礎變量 # URL: 定義指定的網站 # LANG: 臨時改為英文環境,避免 date 解析報錯 #============================= URL="https://www.jd.com" export LANG="en_US.UTF-8"#============================= # 2. 獲取證書過期時間戳 # curl -Lv:顯示詳細信息并跟隨重定向 # egrep 'expire date':提取證書過期時間 #============================= EXPIRE_DATE_RAW=$(curl -Lv "${URL}" -o /dev/null 2>&1 | grep -i 'expire date' | awk -F 'date:|GMT' '{print $2}') EXPIRE_SECOND=$(date -d "${EXPIRE_DATE_RAW}" +%s)#============================= # 3. 獲取當前時間戳 #============================= NOW_SECOND=$(date +%s)#============================= # 4. 計算剩余天數 #============================= EXPIRE_DAYS=$(( (EXPIRE_SECOND - NOW_SECOND) / 86400 ))#============================= # 5. 輸出結果 #============================= if [ "${EXPIRE_DAYS}" -le 300 ]; thenecho "[警告] ${URL} 的 HTTPS 證書即將過期,還有 ${EXPIRE_DAYS} 天" elseecho "[正常] ${URL} 的 HTTPS 證書還剩 ${EXPIRE_DAYS} 天" fi
-
檢查多個指定網站的HTTPS 證書過期時間
vim check_https_cert.sh chmod 755 check_https_cert.sh
#!/bin/bash#============================= # 1. 基礎變量 # LANG: 臨時改為英文環境,避免 date 解析報錯 # URLS: 定義要檢測的多個網站 #============================= URLS=("https://www.jd.com" "https://www.baidu.com" "https://www.taobao.com") export LANG="en_US.UTF-8"#============================= # 2. 遍歷檢測每個 URL 的證書有效期 #============================= for URL in "${URLS[@]}"; do# 2.1 獲取證書過期時間(原始格式)EXPIRE_DATE_RAW=$(curl -Lv "${URL}" -o /dev/null 2>&1 | grep -i 'expire date' | awk -F 'date:|GMT' '{print $2}')# 2.2 轉換為時間戳EXPIRE_SECOND=$(date -d "${EXPIRE_DATE_RAW}" +%s)# 2.3 當前時間戳NOW_SECOND=$(date +%s)# 2.4 計算剩余天數EXPIRE_DAYS=$(( (EXPIRE_SECOND - NOW_SECOND) / 86400 ))#=============================# 3. 輸出結果#=============================if [ "${EXPIRE_DAYS}" -le 300 ]; thenecho "[警告] ${URL} 的 HTTPS 證書即將過期,還有 ${EXPIRE_DAYS} 天"elseecho "[正常] ${URL} 的 HTTPS 證書還剩 ${EXPIRE_DAYS} 天"fi done
總結
本文從理論到實踐,詳細闡述了HTTPS如何為HTTP協議提供加密、認證和完整性保護,從而構筑現代Web安全的核心防線。我們不僅剖析了TLS握手的工作流程,動手創建了自簽名證書,更通過多個漸進式的實戰案例(單點HTTPS/HTTP2、重定向、集群配置)展示了如何在復雜的生產環境中應用它。
-
💎 核心價值:HTTPS已不再是可選項,而是現代網站的標配。它保護用戶隱私、提升網站信譽(瀏覽器安全標識🔒)、同時也是使用HTTP/2等現代協議的前提條件。
-
?? 實踐意義:本文提供的案例和優化、監控方案,源自于真實的運維場景。正確地配置HTTPS(如選擇安全的密碼套件、開啟HSTS、配置重定向)和建立有效的監控(如證書過期監控),是保障服務穩定性和安全性的關鍵。
-
🔮 未來方向:安全是一個持續的過程。TLS協議版本和推薦的加密套件也在不斷更新以應對新的威脅。自動化(如使用Let’s Encrypt自動續期證書)和更嚴格的安全策略(如預加載HSTS)是未來的發展趨勢。