TLS 1.3 協定原理與安全性分析

An in-depth analysis of TLS 1.3 protocol, including its principles, security improvements, and configuration recommendations

TLS 1.3 簡介

TLS(Transport Layer Security)是一種加密協定,用於保護網路通訊的安全性。TLS 1.3 於 2018 年 8 月正式發布(RFC 8446),是 TLS 協定的最新版本,相較於前一代 TLS 1.2,在安全性和效能方面都有顯著的提升。

TLS 1.3 的主要設計目標包括:

  • 簡化協定:移除不安全或過時的加密演算法
  • 提升效能:減少握手所需的往返次數
  • 增強安全性:強制使用前向保密(Forward Secrecy)
  • 減少攻擊面:移除可能被利用的功能

與 TLS 1.2 的差異

加密套件的變更

TLS 1.3 大幅簡化了支援的加密套件,移除了以下不安全的演算法:

移除項目原因
RSA 金鑰交換不支援前向保密
CBC 模式加密容易受到 Padding Oracle 攻擊
RC4 加密已被證明不安全
SHA-1 雜湊碰撞攻擊風險
靜態 DH不支援前向保密
DES/3DES金鑰長度不足

TLS 1.3 僅支援以下五種加密套件:

1
2
3
4
5
TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
TLS_AES_128_GCM_SHA256
TLS_AES_128_CCM_8_SHA256
TLS_AES_128_CCM_SHA256

握手效能比較

特性TLS 1.2TLS 1.3
完整握手2-RTT1-RTT
恢復握手1-RTT0-RTT
金鑰交換RSA/DHE/ECDHE僅 DHE/ECDHE

握手流程

TLS 1.3 完整握手流程

TLS 1.3 的握手流程大幅簡化,僅需一次往返即可完成:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
客戶端                                              伺服器

ClientHello
  + key_share
  + signature_algorithms
  + supported_versions        -------->
                                                ServerHello
                                                  + key_share
                                                  + supported_versions
                                        {EncryptedExtensions}
                                        {CertificateRequest*}
                                               {Certificate}
                                         {CertificateVerify}
                              <--------          {Finished}
{Certificate*}
{CertificateVerify*}
{Finished}                    -------->
[Application Data]            <------->    [Application Data]

握手步驟說明

  1. ClientHello:客戶端發送支援的加密參數、金鑰共享(key_share)和支援的 TLS 版本

  2. ServerHello:伺服器選擇加密參數並回傳其金鑰共享

  3. 加密擴展:伺服器發送加密的擴展資訊

  4. 憑證:伺服器發送其數位憑證

  5. 憑證驗證:伺服器簽署握手訊息以證明擁有私鑰

  6. Finished:雙方完成握手驗證

0-RTT 恢復模式

TLS 1.3 引入了 0-RTT(Zero Round Trip Time)模式,允許客戶端在恢復連線時立即發送加密的應用程式資料:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
客戶端                                              伺服器

ClientHello
  + early_data
  + key_share
  + psk_key_exchange_modes
  + pre_shared_key
(Application Data*)           -------->
                                                ServerHello
                                               + pre_shared_key
                                                  + key_share
                                        {EncryptedExtensions}
                                               + early_data
                              <--------          {Finished}
(EndOfEarlyData)
{Finished}                    -------->
[Application Data]            <------->    [Application Data]

注意:0-RTT 模式存在重放攻擊的風險,應謹慎使用,且僅適用於冪等操作。

安全性改進

1. 強制前向保密(Forward Secrecy)

TLS 1.3 強制使用具有前向保密特性的金鑰交換演算法(DHE 或 ECDHE)。這意味著即使伺服器的長期私鑰被洩露,過去的通訊記錄仍然無法被解密。

1
2
3
4
5
傳統 RSA 金鑰交換(TLS 1.2):
私鑰洩露 → 所有歷史通訊可被解密

前向保密(TLS 1.3):
私鑰洩露 → 僅當前會話可能受影響,歷史通訊仍安全

2. 加密握手訊息

TLS 1.3 在握手過程中更早開始加密,ServerHello 之後的所有訊息都是加密的。這保護了憑證和其他敏感資訊,減少了中間人攻擊的機會。

3. 數位簽章覆蓋整個握手

在 TLS 1.3 中,CertificateVerify 訊息簽署整個握手記錄,防止降級攻擊和握手訊息的篡改。

4. 移除壓縮功能

TLS 1.3 移除了壓縮功能,防止了 CRIME 和 BREACH 等壓縮相關的攻擊。

5. 移除重新協商

TLS 1.3 完全移除了重新協商機制,消除了相關的安全漏洞(如 CVE-2009-3555)。

安全性比較表

安全特性TLS 1.2TLS 1.3
前向保密選用強制
握手加密部分完整
已知漏洞POODLE, BEAST 等目前無重大漏洞
降級攻擊防護有限完善

設定建議

Nginx 設定範例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
server {
    listen 443 ssl http2;
    server_name example.com;

    # 憑證設定
    ssl_certificate /etc/nginx/ssl/certificate.crt;
    ssl_certificate_key /etc/nginx/ssl/private.key;

    # TLS 版本設定 - 僅允許 TLS 1.2 和 1.3
    ssl_protocols TLSv1.2 TLSv1.3;

    # TLS 1.3 加密套件
    ssl_conf_command Ciphersuites TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256;

    # TLS 1.2 加密套件(向後相容)
    ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;

    # 優先使用伺服器端加密套件
    ssl_prefer_server_ciphers on;

    # Session 設定
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;

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

Apache 設定範例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<VirtualHost *:443>
    ServerName example.com

    # 憑證設定
    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/certificate.crt
    SSLCertificateKeyFile /etc/apache2/ssl/private.key

    # TLS 版本設定
    SSLProtocol -all +TLSv1.2 +TLSv1.3

    # 加密套件設定
    SSLCipherSuite TLSv1.3 TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
    SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384

    # 優先使用伺服器端加密套件
    SSLHonorCipherOrder on

    # HSTS
    Header always set Strict-Transport-Security "max-age=63072000"
</VirtualHost>

最佳實踐建議

  1. 優先使用 TLS 1.3:在所有支援的環境中啟用 TLS 1.3

  2. 停用舊版協定:停用 TLS 1.0 和 TLS 1.1

  3. 謹慎使用 0-RTT

    • 僅用於冪等操作
    • 實作應用層重放保護機制
  4. 定期更新

    • 保持 OpenSSL/BoringSSL 等函式庫更新
    • 關注安全公告
  5. 憑證管理

    • 使用 ECDSA P-256 或 RSA 2048+ 憑證
    • 啟用 OCSP Stapling
    • 設定適當的憑證更新週期
  6. 監控與測試

    • 使用 SSL Labs 等工具定期測試
    • 監控 TLS 握手失敗率
    • 記錄使用的 TLS 版本分布

結論

TLS 1.3 代表了網路安全協定的重大進步,透過簡化設計、移除不安全的功能,以及強制使用現代加密技術,為網路通訊提供了更強的安全保障。建議所有系統管理員和開發者儘快將系統升級至支援 TLS 1.3,並遵循本文提供的設定建議,以確保最佳的安全性。

參考資料

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy