電腦網路與 Internet 通訊

L13 本機 TLS 的信任與名稱驗證

本實驗使用的程式:L13-tls.py。文中指令以課程根目錄為工作目錄;建議下載教材套件,解壓後在 computer-networking 目錄執行。

目標、環境與預測

對應 13、14。Python 3.10 以上、支援 TLS 1.3 的 ssl backend,另需可建立 X509 憑證的 OpenSSL 相容指令。程式建立一次性 RSA2048 自簽憑證,SAN 有 DNS:localhost 與 IP:127.0.0.1;只加入指定 Python SSLContext,不更動 OS 信任庫;暫存憑證及私鑰在結束時刪除。

預測三次結果:明確信任+localhost;明確信任+wrong.test;預設信任庫+localhost。名稱與信任為獨立因素,但驗證通常只回報第一個失敗原因,不能由單一錯誤碼同時讀出全部原因。

執行與紀錄

python3 labs/L13-tls.py

每案記錄 verified、錯誤類別、verify_code/reason 與 reply;verify_code/reason 在不同 backend 可不同,不以完全相同文字評分。結果同時記錄憑證產生指令的版本與 Python ssl 版本,它們可能是不同軟體。

此實驗不是真實公開 CA 部署,不測 ECH、0-RTT 或流量可辨識性。固定自簽 leaf 為明確信任的實驗 anchor,不能推廣為忽略任何外部憑證。

沒有 OpenSSL/TLS 1.3 的離線路線

程式會在建立任何暫存檔前檢查 Python 3.10 以上、ssl backend 的 TLS 1.3 與 OpenSSL 相容指令;任一不符即結束並提示改走本路線。使用下列人工條件完成相同判讀,清楚註明未執行握手。三案的憑證都在有效期內,用途與其他驗證條件也都符合,只改變是否明確信任此憑證與預期名稱:

預期名稱明確信任此憑證?憑證 SAN預測是否通過與原因
localhost是DNS:localhost____
wrong.test是DNS:localhost____
localhost否,且不在信任鏈DNS:localhost____

問題與提交

  1. TCP 可達與 TLS 驗證各支持何結論?
  2. 明確信任為何不能解除名稱錯誤?
  3. 為何不使用 check_hostname=false「修正」?
  4. 憑證工具與 Python ssl 版本不同有何影響?

提交三案例輸出或離線表,標示路線、版本及限制。評分預測 20、紀錄 30、原因 30、信任邊界 20。OpenSSL 缺失、政策限制等不是更改系統安全設定的理由,使用離線路線即可。

本版只驗證 macOS/Python 3.12.14,另顯式測 STRICT/PARTIAL_CHAIN;不等同 3.13 以上實測。憑證含 SKI/AKI,完整版本與結果見 README 及驗證紀錄。3.13 起預設旗標改變,見 Python ssl 文件;其他環境結果不同時,記錄錯誤並保留驗證。