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 | ____ |
問題與提交
- TCP 可達與 TLS 驗證各支持何結論?
- 明確信任為何不能解除名稱錯誤?
- 為何不使用 check_hostname=false「修正」?
- 憑證工具與 Python ssl 版本不同有何影響?
提交三案例輸出或離線表,標示路線、版本及限制。評分預測 20、紀錄 30、原因 30、信任邊界 20。OpenSSL 缺失、政策限制等不是更改系統安全設定的理由,使用離線路線即可。
本版只驗證 macOS/Python 3.12.14,另顯式測 STRICT/PARTIAL_CHAIN;不等同 3.13 以上實測。憑證含 SKI/AKI,完整版本與結果見 README 及驗證紀錄。3.13 起預設旗標改變,見 Python ssl 文件;其他環境結果不同時,記錄錯誤並保留驗證。