
一份配置跑通 Caddy 选择性 mTLS按 IP 定要不要客户端证书【免费下载链接】caddyFast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS项目地址: https://gitcode.com/GitHub_Trending/ca/caddy内网微服务要求双向 TLSmTLSMutual TLS同一个域名又对公网开放——如果强制所有访客出示客户端证书正常用户会在握手阶段被直接拦下。Caddy 对此的解法就是选择性 mTLS靠几条条件规则按来源 IP 或 SNIServer Name Indication决定验不验客户端证书。下面给出一份可直接落地的 Caddyfile配 curl 实测和一份踩坑速查读完你就能把这个条件化双向认证模式搬到自己那套内网入口上。先搞懂——“双向”到底在互验什么把这事想成进大楼刷工牌进门的动作其实是两次验证。服务器先亮出“营业执照”服务器证书客户端确认它确实是自己要找的那栋楼然后服务器反过来查你的“工牌”客户端证书——查工牌这一步就是 mTLS 多出来的那半边。维度全量双向认证选择性 mTLS认证覆盖范围每条连接都查工牌只对命中条件的连接查典型场景纯内网服务网格同一域名内外网流量混跑配置复杂度一套信任池全局生效策略 匹配器分层写Caddy 一处搞定Caddy 里做这件事靠两样东西连接策略connection_policy以及它内部的match匹配器sni、remote_ip、sni_regexp等定义在modules/caddytls/matchers.go。策略按书写顺序逐个尝试先命中的生效——这个顺序细节是后面一半坑的根源先记住。跑之前的两分钟准备项目要求Caddy 版本2.6 及以上CA 根证书一个 PEM/DER 文件放到/etc/caddy/自签或企业 CA 均可编辑器任意如 VS Code最小化准备就一条命令cp 你的ca根证书.pem /etc/caddy/gw-ca.pem怎么自建 CA 这里不展开任何你信任的 CA 根证书文件都行。一份完整可跑的 Caddyfileclient_auth 一次配齐https://gw.corp.example { respond 服务在线身份未核验 # 特例放最前内网段一律验证书 connection_policy { match { remote_ip 10.20.0.0/16 # 示例内网段 } client_auth { mode require_and_verify # 没证书或证书无效握手直接拒 trust_pool file { pem_file /etc/caddy/gw-ca.pem } } } # 默认兜底只问不验不挡外网 connection_policy { client_auth { mode request # 询问客户端证书可有可无 trust_pool file { pem_file /etc/caddy/gw-ca.pem } } } }这行是整篇的命门mode require_and_verify。如果只写require客户端必须交证书但服务器不验签名伪造的证书你拦不住生产环境别用它。默认策略故意用request而不是require——没有证书的外网流量照样走完握手所谓“条件化”就是松的这一侧撑起来的。想按域名区分而不是按 IP把match里的remote_ip换成sni gw.corp.example即可写法一致mode 一共四种request / require / verify_if_given / require_and_verify松一档紧一档按需取用。配置语法可对照仓库里的集成测试用例caddytest/integration/caddyfile_adapt/tls_client_auth_cert_file.caddyfiletestconnection_policy的解析逻辑在modules/caddytls/connpolicy.go拿不准时翻源码最稳。动手验证——三组 curl 确认配对了# ① 内网主机10.20.x.x不带证书 curl -v https://gw.corp.example # ② 同内网主机带有效客户端证书 curl --cert ./ops.crt --key ./ops.key \ --cacert /etc/caddy/gw-ca.pem https://gw.corp.example # ③ 白名单外主机公网出口不带证书 curl -v https://gw.corp.example命令预期现象不符时查什么① 内网无证书握手失败报证书验证类错误connection_policy 顺序是否误落默认策略② 内网带证书200返回正常响应体服务器侧 CA 文件是否就是签发它的那份③ 外网无证书200握手成功默认策略 mode 是否真是 request跑之前先来一句caddy adapt --config Caddyfile --pretty做语法自检它都过不了就别急着 curl。踩坑速查表现象根因解法内网带证书仍被拒报 unknown CACA 路径写错或放的不是签发 CAopenssl x509 -in /etc/caddy/gw-ca.pem -noout -subject核对指纹客户端本地验证都过、服务器上不行证书链不完整缺中间证书重新导出包含完整链的客户端证书同一份证书昨天能通今天不行系统时间漂移证书被判过期或未生效同步 NTP 时间内网流量没被验证书行为像没配无 match 的默认策略写在前面先命中兜底了带 match 的策略前置默认策略放最后再往前一步让选择性 mTLS 自己跑起来以后如果想把客户端 CA 的签发、续期也自动化可以翻modules/caddypki/里的 PKI 模块。以后如果匹配规则复杂到 Caddyfile 写不下可以看modules/caddyhttp/celmatcher.go的 CEL 表达式匹配器。以后想审计谁在反复握手失败把modules/logging/和modules/metrics/挂上TLS 失败就能进日志和看板。走到这里你只需要记住一句话特例策略在前、默认策略殿后内紧外松。哪台机器握手莫名其妙被拒把caddy adapt的输出贴到评论区咱们一起拆。【免费下载链接】caddyFast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS项目地址: https://gitcode.com/GitHub_Trending/ca/caddy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考