HTTPS 與安全#

HTTPS 在 HTTP 的基礎上加入了 TLS/SSL 安全層,實作加密傳輸和身份認證。本章涵蓋 HTTPS 原理、加密演算法、數位憑證和 TLS 握手過程。

為什麼需要 HTTPS#

HTTP 的安全問題#

HTTP 明文傳輸存在三大風險:

風險描述後果
竊聽資料明文傳輸,可被截獲敏感資訊洩露
竄改資料可被修改頁面被插入廣告、惡意程式碼
冒充無法驗證對方身份釣魚網站騙取資訊

安全通訊的四要素#

要素說明
機密性(Confidentiality)資料不被竊聽
完整性(Integrity)資料不被竄改
身份認證(Authentication)確認對方身份
不可否認(Non-repudiation)無法抵賴已發生的行為

HTTPS 基礎#

HTTPS = HTTP + TLS#

flowchart TB
    subgraph Stack["HTTPS 協議棧"]
        L1["應用層(HTTP)"]
        L2["安全層(TLS/SSL)"]
        L3["傳輸層(TCP)"]
        L4["網路層(IP)"]
    end

    L1 --> L2 --> L3 --> L4

    style L2 fill:#c8e6c9
協定埠號特點
HTTP80明文傳輸
HTTPS443加密傳輸

HTTPS 只是把 HTTP 的傳輸層從 TCP 換成了 TLS/TCP。語法、語義和 HTTP 完全相同。

TLS 發展歷程#

版本年份狀態
SSL 2.01995已廢棄,不安全
SSL 3.01996已廢棄,不安全
TLS 1.01999已廢棄
TLS 1.12006已廢棄
TLS 1.22008當前主流
TLS 1.32018最新推薦

加密演算法#

對稱加密#

特點:加密和解密使用同一個金鑰

明文 ──[金鑰]──→ 密文 ──[同一金鑰]──→ 明文
演算法金鑰長度特點
AES128/192/256 位最常用,有硬體加速
ChaCha20256 位軟體效能好,行動端常用

分組模式

  • GCM:認證加密,推薦使用
  • CBC:較老,有安全漏洞

對稱加密速度快,但有金鑰交換問題:如何安全地把金鑰傳給對方?

非對稱加密#

特點:使用一對金鑰(公鑰 + 私鑰)

公鑰加密 ──→ 只有私鑰能解密
私鑰加密 ──→ 只有公鑰能解密(用於簽章)
演算法特點
RSA經典演算法,2048 位起步
ECC橢圓曲線,金鑰短、效能好
ECDHEECC 金鑰交換演算法

RSA vs ECC 安全等級對比

RSA 金鑰長度等效 ECC 長度
1024 位160 位
2048 位224 位
3072 位256 位

混合加密#

TLS 結合兩者:先用非對稱加密交換對稱會話金鑰(解決金鑰交換問題),再用對稱加密通訊(保證加密效率)。

摘要演算法與數位簽章#

摘要演算法#

將任意長度資料壓縮為固定長度的「指紋」:

演算法輸出長度安全性
MD5128 位不安全,已廢棄
SHA-1160 位不安全,已廢棄
SHA-256256 位推薦
SHA-384384 位推薦

特性:

  • 單向性:無法從摘要反推原文
  • 雪崩效應:原文微小改動導致摘要巨變
  • 抗碰撞:難以找到兩個不同原文有相同摘要

數位簽章#

用私鑰對摘要加密,實作身份認證和不可否認:

flowchart LR
    subgraph Sender["發送方"]
        S1["原文"] --> S2["計算摘要"]
        S2 --> S3["私鑰加密"]
        S3 --> S4["簽章"]
    end

    subgraph Receiver["接收方"]
        R1["收到原文 + 簽章"] --> R2["用公鑰解密"]
        R2 --> R3["比對摘要"]
        R3 --> R4["驗證通過"]
    end

    S4 -->|"發送"| R1

    style S3 fill:#fff3e0
    style R4 fill:#c8e6c9

數位簽章只能由私鑰持有者建立,任何人都可以用公鑰驗證。這實作了身份認證和不可否認。

數位憑證與 CA#

信任問題#

非對稱加密解決了金鑰交換,但帶來新問題:如何確定公鑰是真的?

攻擊者可以:
1. 冒充網站,發送假公鑰
2. 你用假公鑰加密,攻擊者用其私鑰解密
3. 攻擊者再用真公鑰加密轉發給真網站
→ 中間人攻擊(Man-in-the-Middle)

CA 憑證體系#

CA(Certificate Authority) 是可信的第三方機構,為公鑰背書:

flowchart TB
    Root["根 CA<br/>(自簽章,信任起點)"] -->|簽發| Intermediate["中級 CA"]
    Intermediate -->|簽發| Site["網站憑證<br/>(使用者訪問的網站)"]

    style Root fill:#ffcdd2
    style Intermediate fill:#fff3e0
    style Site fill:#c8e6c9

憑證內容#

字段說明
頒發者哪個 CA 簽發的
主題憑證持有者資訊
公鑰網站的公鑰
有效期起始和截止時間
簽章演算法如 SHA256withRSA
簽章CA 用私鑰對以上內容的簽章

憑證驗證流程#

flowchart TD
    A["1. 收到伺服器憑證"] --> B["2. 檢查憑證有效期"]
    B --> C["3. 檢查是否被吊銷 (CRL/OCSP)"]
    C --> D["4. 用上級 CA 公鑰驗證簽章"]
    D --> E["5. 逐級驗證直到根 CA"]
    E --> F["6. 驗證域名是否匹配"]

    style F fill:#c8e6c9

憑證類型#

類型特點
DV(Domain Validation)只驗證域名所有權,最快
OV(Organization Validation)驗證組織資訊
EV(Extended Validation)最嚴格,瀏覽器顯示公司名

TLS 握手過程#

TLS 1.2 握手(ECDHE)#

sequenceDiagram
    participant C as 用戶端
    participant S as 伺服器

    C->>S: Client Hello<br/>(版本、隨機數、支援的密碼套件)
    S->>C: Server Hello<br/>(版本、隨機數、選定的密碼套件)
    S->>C: Certificate (伺服器憑證)
    S->>C: Server Key Exchange<br/>(ECDHE 公鑰 + 簽章)
    S->>C: Server Hello Done

    C->>S: Client Key Exchange (ECDHE 公鑰)

    Note over C,S: 雙方計算 Pre-Master Secret<br/>產生 Master Secret 和會話金鑰

    C->>S: Change Cipher Spec
    C->>S: Finished
    S->>C: Change Cipher Spec
    S->>C: Finished

    Note over C,S: 開始加密通訊

握手過程交換三個隨機數:Client Random、Server Random、Pre-Master Secret。三者共同產生會話金鑰,即使其中一個洩露也難以破解。

密碼套件#

密碼套件定義了 TLS 使用的演算法組合:

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
 │    │     │         │    │    │
 │    │     │         │    │    └── 摘要演算法
 │    │     │         │    └── 分組模式
 │    │     │         └── 對稱加密演算法
 │    │     └── 簽章演算法
 │    └── 金鑰交換演算法
 └── 協定
常見密碼套件
推薦(TLS 1.2):
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256

TLS 1.3 密碼套件更簡潔:
- TLS_AES_128_GCM_SHA256
- TLS_AES_256_GCM_SHA384
- TLS_CHACHA20_POLY1305_SHA256

TLS 1.3 改進#

改進點TLS 1.2TLS 1.3
握手延遲2-RTT1-RTT(可 0-RTT)
金鑰交換RSA/ECDHE僅 ECDHE
對稱加密多種僅 AEAD
前向保密可選強制

前向保密(Forward Secrecy):即使長期私鑰洩露,過去的通訊記錄也無法被解密。ECDHE 每次握手產生臨時金鑰,天然支援前向保密。

實際應用#

設定 HTTPS(Nginx)#

server {
    listen 443 ssl http2;
    server_name example.com;

    # 憑證和私鑰
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

    # TLS 版本
    ssl_protocols TLSv1.2 TLSv1.3;

    # 密碼套件
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers on;

    # HSTS
    add_header Strict-Transport-Security "max-age=31536000" always;
}

檢測工具#

# 查看憑證資訊
openssl s_client -connect example.com:443 -servername example.com

# 查看憑證詳情
openssl x509 -in cert.pem -text -noout

# 測試 TLS 設定
nmap --script ssl-enum-ciphers -p 443 example.com

線上檢測#

本章小結#

概念關鍵點
HTTPSHTTP + TLS,埠號 443
對稱加密AES/ChaCha20,速度快,需要交換金鑰
非對稱加密RSA/ECC,用於金鑰交換和簽章
數位簽章私鑰簽章,公鑰驗證,實作身份認證
憑證CA 簽發,證明公鑰的真實性
TLS 握手協商參數、交換金鑰、驗證身份
TLS 1.3更快、更安全,強制前向保密