戰(zhàn):條件化雙向認(rèn)證與客戶(hù)端證書(shū)校驗(yàn))
Caddy mTLS 實(shí)戰(zhàn)條件化雙向認(rèn)證與客戶(hù)端證書(shū)校驗(yàn)【免費(fèi)下載鏈接】caddyFast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ca/caddy一個(gè)常見(jiàn)的現(xiàn)實(shí)訴求同一個(gè) HTTPS 入口既服務(wù)公網(wǎng)也服務(wù)內(nèi)網(wǎng)服務(wù)——只有內(nèi)網(wǎng)來(lái)源的請(qǐng)求需要出示客戶(hù)端證書(shū)公網(wǎng)保持普通訪(fǎng)問(wèn)。Caddy 的條件化 mTLS 正好覆蓋這個(gè)場(chǎng)景通過(guò)connection_policy在 TLS 握手階段做條件匹配對(duì)命中條件的連接啟用客戶(hù)端證書(shū)校驗(yàn)其余連接照常放行。一、為什么要按條件開(kāi)雙向認(rèn)證mTLSMutual TLS雙向 TLS即客戶(hù)端和服務(wù)器互驗(yàn)身份客戶(hù)端驗(yàn)證服務(wù)器的證書(shū)服務(wù)器也要驗(yàn)證客戶(hù)端的證書(shū)——可以理解為服務(wù)端也要求客戶(hù)端出示身份證。全量強(qiáng)制 mTLS 和條件化 mTLS 各有代價(jià)維度全量強(qiáng)制 mTLS條件化 mTLS適用場(chǎng)景內(nèi)網(wǎng)服務(wù)網(wǎng)格、API 間互調(diào)同一入口混合公網(wǎng)訪(fǎng)問(wèn)與內(nèi)部服務(wù)客戶(hù)端體驗(yàn)所有客戶(hù)端都要裝證書(shū)瀏覽器/腳本接入成本高僅命中條件的連接需要證書(shū)安全邊界一刀切簡(jiǎn)單清晰按來(lái)源收緊敏感鏈路強(qiáng)校驗(yàn)主要代價(jià)可用性受損排障時(shí)也要先解決證書(shū)問(wèn)題匹配條件本身成為安全邊界需認(rèn)真設(shè)計(jì)選擇性雙向認(rèn)證的價(jià)值在于把校驗(yàn)強(qiáng)度交給條件而不是交給全部。二、一次握手里發(fā)生了什么Caddy 在 TLS 握手階段對(duì)每個(gè)連接按順序評(píng)估 TLS 連接策略connection policy源碼見(jiàn)modules/caddytls/connpolicy.go命中的第一條策略決定該連接是否要求客戶(hù)端證書(shū)client_auth的mode有兩個(gè)常用取值request向客戶(hù)端請(qǐng)求證書(shū)但不強(qiáng)制、不校驗(yàn)?zāi)貌坏揭材苓B上require_and_verify必須提供有效證書(shū)且能通過(guò)校驗(yàn)否則握手失敗提供 trust_pool 時(shí)這也是默認(rèn)值。三、一份能直接用的 Caddyfile 與 connection_policy 條件匹配寫(xiě)法先把 CA 根證書(shū)放到 Caddy 配置目錄如/etc/caddy/caddy.ca.cer再使用下面這份完整配置{ # 全局可選日志等 } https://api.example.com { tls { client_auth { mode request trust_pool file { pem_file /etc/caddy/caddy.ca.cer } } } connection_policy { match { remote_ip 192.168.1.0/24 } client_auth { mode require_and_verify trust_pool file { pem_file /etc/caddy/caddy.ca.cer } } } respond ok }語(yǔ)義是全站默認(rèn)request不擋任何人來(lái)源落在192.168.1.0/24的連接命中connection_policy升級(jí)為require_and_verify。匹配維度速查匹配器定義見(jiàn)modules/caddytls/matchers.go匹配項(xiàng)匹配對(duì)象典型用途sni域名支持左標(biāo)簽通配符僅對(duì)某個(gè)域名啟用 mTLSsni_regexp域名的正則表達(dá)式一批子域統(tǒng)一命中remote_ip客戶(hù)端 IP / CIDR!前綴表示排除mTLS 按 IP 認(rèn)證如僅內(nèi)網(wǎng)段強(qiáng)制local_ip服務(wù)器本地接口 IP區(qū)分多網(wǎng)卡、多監(jiān)聽(tīng)端點(diǎn)注意連接策略按定義順序匹配靠前者優(yōu)先。四、驗(yàn)證矩陣curl 按證書(shū) × 來(lái)源四象限驗(yàn)證場(chǎng)景來(lái)源是否帶客戶(hù)端證書(shū)預(yù)期1內(nèi)網(wǎng)條件內(nèi)不帶握手失敗要求證書(shū)而未提供2內(nèi)網(wǎng)條件內(nèi)帶有效證書(shū)成功返回 ok3外部條件外不帶成功僅 request 模式4外部條件外帶成功證書(shū)收到但不強(qiáng)制場(chǎng)景 1、2 在內(nèi)網(wǎng)機(jī)器上執(zhí)行服務(wù)器證書(shū)若也是自簽 CA 簽發(fā)--cacert需同時(shí)能驗(yàn)證服務(wù)器證書(shū)# 場(chǎng)景1不帶證書(shū)應(yīng)失敗 curl -v https://api.example.com # 場(chǎng)景2帶客戶(hù)端證書(shū)應(yīng)成功 curl --cert /etc/caddy/client.crt --key /etc/caddy/client.key \ --cacert /etc/caddy/caddy.ca.cer https://api.example.com # 場(chǎng)景3從外部主機(jī)執(zhí)行不帶證書(shū)應(yīng)成功 curl --cacert /etc/caddy/caddy.ca.cer https://api.example.com改動(dòng)配置后先用 adapt 校驗(yàn)語(yǔ)法再生效caddy adapt --config /etc/caddy/Caddyfile --pretty輸出 JSON 中的tls_connection_policies順序應(yīng)與 Caddyfile 中connection_policy的書(shū)寫(xiě)順序一致可借此核對(duì)誰(shuí)先匹配。五、踩坑清單CA 路徑寫(xiě)錯(cuò)pem_file相對(duì)路徑是相對(duì) Caddyfile 所在目錄解析的不確定就用絕對(duì)路徑/etc/caddy/...。證書(shū)時(shí)效與系統(tǒng)時(shí)間客戶(hù)端證書(shū)過(guò)期、未生效或服務(wù)器時(shí)鐘偏移都會(huì)導(dǎo)致require_and_verify失敗先核對(duì)時(shí)間。策略順序多條connection_policy按定義順序匹配先寫(xiě)的具體條件會(huì)被后寫(xiě)的寬泛條件吃掉時(shí)調(diào)整順序。先 adapt 后 reloadcaddy adapt能提前暴露拼寫(xiě)與結(jié)構(gòu)錯(cuò)誤比 reload 后看日志更快。IP 可偽造remote_ip匹配的是 TCP 層來(lái)源 IP經(jīng)過(guò)代理/隧道時(shí)可被偽裝不要把它當(dāng)作唯一鑒權(quán)手段mTLS 按 IP 認(rèn)證只應(yīng)作為縱深防御的一環(huán)。六、進(jìn)階方向PKI 自動(dòng)管理證書(shū)用 Caddy 內(nèi)置 PKI 模塊簽發(fā)并管理客戶(hù)端證書(shū)與內(nèi)部 CA省去手工換證讓證書(shū)生命周期隨配置走。握手日志與失敗率監(jiān)控開(kāi)啟 TLS 握手日志結(jié)合訪(fǎng)問(wèn)日志統(tǒng)計(jì)認(rèn)證失敗率異常飆升往往意味著證書(shū)過(guò)期或有人試探。性能與會(huì)話(huà)復(fù)用內(nèi)部高頻互調(diào)的服務(wù)啟用會(huì)話(huà)復(fù)用減少重復(fù)握手與證書(shū)校驗(yàn)的開(kāi)銷(xiāo)。條件化 mTLS 把是否出示身份證的決定權(quán)交給了匹配條件接下來(lái)更值得琢磨的是你打算用哪幾個(gè)維度組合這個(gè)條件——sni_regexp加remote_ip的組合能覆蓋哪些單維度覆蓋不了的場(chǎng)景【免費(fèi)下載鏈接】caddyFast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ca/caddy創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考