news 2026/8/29 11:54:04

一份配置跑通 Caddy 选择性 mTLS:按 IP 定要不要客户端证书

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一份配置跑通 Caddy 选择性 mTLS:按 IP 定要不要客户端证书

一份配置跑通 Caddy 选择性 mTLS:按 IP 定要不要客户端证书

【免费下载链接】caddyFast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS项目地址: https://gitcode.com/GitHub_Trending/ca/caddy

内网微服务要求双向 TLS(mTLS,Mutual TLS),同一个域名又对公网开放——如果强制所有访客出示客户端证书,正常用户会在握手阶段被直接拦下。Caddy 对此的解法就是选择性 mTLS:靠几条条件规则,按来源 IP 或 SNI(Server Name Indication)决定验不验客户端证书。下面给出一份可直接落地的 Caddyfile,配 curl 实测和一份踩坑速查,读完你就能把这个条件化双向认证模式搬到自己那套内网入口上。

先搞懂——“双向”到底在互验什么

把这事想成进大楼:刷工牌进门的动作其实是两次验证。服务器先亮出“营业执照”(服务器证书),客户端确认它确实是自己要找的那栋楼;然后服务器反过来查你的“工牌”(客户端证书)——查工牌这一步,就是 mTLS 多出来的那半边。

维度全量双向认证选择性 mTLS
认证覆盖范围每条连接都查工牌只对命中条件的连接查
典型场景纯内网服务网格同一域名,内外网流量混跑
配置复杂度一套信任池全局生效策略 + 匹配器分层写,Caddy 一处搞定

Caddy 里做这件事靠两样东西:连接策略connection_policy,以及它内部的match匹配器(sniremote_ipsni_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 根证书文件都行。

一份完整可跑的 Caddyfile:client_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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/29 11:53:56

C#异步编程演进:从回调地狱到async/await的完整指南

1. 从“回调地狱”到“同步写法”:C#异步编程的演进脉络 如果你在.NET平台上写过几年代码,尤其是经历过.NET Framework 2.0/3.5时代,那么对异步编程的认知很可能是一段从“痛苦”到“舒畅”的转变史。早期的异步操作,比如读取一个…

作者头像 李华
网站建设 2026/8/29 11:52:12

PowerToys Run 启动器:3 个场景带你快速上手的完整使用指南

PowerToys Run 启动器:3 个场景带你快速上手的完整使用指南 【免费下载链接】PowerToys Microsoft PowerToys is a collection of utilities that supercharge productivity and customization on Windows 项目地址: https://gitcode.com/GitHub_Trending/po/Powe…

作者头像 李华
网站建设 2026/8/29 11:49:05

模型评测升级前的记录规范

模型评测升级前的记录规范本文围绕“升级前先做这几项确认”整理可复现的检查思路。所有阈值、配置和结果均应在隔离环境中记录输入、版本与资源条件后再解释;下文示例不对应真实组织、用户、流量或成本数据。 1. 用受控样例界定问题 2. 评测集数据污染与版本漂移&a…

作者头像 李华
网站建设 2026/8/29 11:48:09

后端技术栈更新迭代,哪些值得长期投入学习

你盯着简历上那行“熟悉Java/Go/Python”已经三年了,每出一个新框架就焦虑一次。其实后端技术栈的更新迭代,大部分是旧瓶装新酒,真正值得你押上未来的东西,从来不是某个具体工具,而是底层逻辑的稳定内核。 语言&#…

作者头像 李华
网站建设 2026/8/29 11:44:31

STM32U5 LPBAM低功耗实战:从原理到功耗调优全解析

最近在给一个可穿戴医疗贴片做方案换型,主控从 STM32L4 系列换到了 STM32U5 系列。芯片性能是上去了,但功耗反而成了大麻烦:L4 上原本用的停止模式加定时器唤醒那套老套路,在 U5 上虽然能跑,但始终没把 U5 的真正优势发…

作者头像 李华