FEATURED · 精选文章

3分钟配置Caddy选择性mTLS认证:内网强制双向认证,公网照常访问

发布时间 / 2026/8/29 22:02:25
来源 / 创域科博编辑部
栏目 / 资讯中心
3分钟配置Caddy选择性mTLS认证:内网强制双向认证,公网照常访问 3分钟配置Caddy选择性mTLS认证内网强制双向认证公网照常访问【免费下载链接】caddyFast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS项目地址: https://gitcode.com/GitHub_Trending/ca/caddy内部服务既要防住未授权的客户端又不能拦掉正常用户怎么办用 Caddy多平台 Web 服务器内置自动 HTTPS做选择性 mTLS只让该来的交客户端证书。理解 mTLS 和选择性认证的差别会写 Caddy 的 client_auth 与 trust_pool 配置学会按 IP / SNI 区分认证强度拿到一套可直接跑的验证命令原理拆解普通 HTTPS 只验服务器客户端可以随便来mTLSMutual TLS双向 TLS反过来再验一次客户端。Caddy 的做法是在 TLS 握手的 ClientHello 阶段做判断拿域名SNI或客户端 IP 去匹配一组连接策略命中哪条就按哪条的认证强度办事。好比小区门禁员工刷卡进内区访客登记即可进大堂同一道闸、两把规则。动手实践先跑通把 CA 放进信任池只询问不拦截给 Caddy 一份可信签发者名单信任池再开最弱的request模式询问客户端证书但没有也不拦。用这个模式先验证链路通不通不会把真实用户挡在门外。# Caddyfile —— 先确认文件放在配置目录如 /etc/caddy/Caddyfile { local_certs } localhost:8443 { tls a.caddy.localhost.crt a.caddy.localhost.key tls { client_auth { mode request # 只询问证书没有也放行 trust_pool file { pem_file caddy.ca.cer # 你的客户端 CA 根证书 } } } respond hello, verified or not }测试仓库里就有一份现成的 CA 和服务器证书caddytest/caddy.ca.cer、caddytest/a.caddy.localhost.crt。改完跑caddy reload --config /etc/caddy/Caddyfile日志不报 trust_pool 相关错误、用 curl 能收到响应说明信任池加载成功。收严规则只让内网 IP 交出证书要按条件区分认证强度就写多条 connection_policy连接策略靠前的先匹配。下面第一条把内网段设为必须交证书且验签第二条兜底其余 IP 保持询问模式。localhost:8443 { tls a.caddy.localhost.crt a.caddy.localhost.key # 内网段强制 mTLS必须先匹配否则被兜底策略吃掉 connection_policy { match { remote_ip 192.168.0.0/16 } client_auth { mode require_and_verify # 无证书直接拒绝握手 trust_pool file { pem_file caddy.ca.cer } } } # 兜底策略其余来源只询问 connection_policy { client_auth { mode request trust_pool file { pem_file caddy.ca.cer } } } respond policy matched }跑起来后用两条命令各测一次客户端证书需由 caddy.ca.cer 签发# 不带证书模拟内网访问 —— 应被拒绝 curl -k https://localhost:8443 # 带上 CA 签发的客户端证书 —— 应返回 policy matched curl -k --cert a.caddy.localhost.crt --key a.caddy.localhost.key https://localhost:8443换个维度按 SNI 域名匹配不想按 IP 分就换 SNI客户端在握手时申报的域名。握手匹配器一共四个sni精确或左通配符匹配、sni_regexp正则、remote_ip、local_ip。例如只对admin.example.com强制认证connection_policy { match { sni admin.example.com } client_auth { mode require_and_verify trust_pool file { pem_file caddy.ca.cer } } }caddy adapt --config /etc/caddy/Caddyfile --pretty能展开出完整的 JSON 配置。检查tls_connection_policies数组里 match 字段是否写进了你的 sni 或 remote_ip确认无误再 reload。对照测试用例核对写法不确定语法时可以直接看仓库里的适配测试左边是 Caddyfile、右边是期望的 JSON。比如 tls_client_auth_cert_file.caddyfiletest 演示了 file 信任池的完整展开结果照着它检查你的 adapt 输出基本不会写错。进阶玩法信任池来源不止文件capools.go 提供inline配置内嵌、system系统根证书、folder目录批量加载等 provider轮换 CA 时换文件夹即可。加一层吊销校验client_auth里可加verifier leaf模块做额外校验避免证书有效但已被吊销的漏网情况。策略命中顺序速查Caddy 按声明顺序取第一条命中的策略所以把最严的放最前。排错速查现象原因处理不带证书的请求没被拒兜底策略用了request或严格策略写在了后面检查策略声明顺序把require_and_verify那条放最前握手直接报bad certificate客户端证书不是信任池里 CA 签的确认pem_file指向的正是签发该证书的那份根证书adapt 报unknown subdirective子指令拼错如写成trust_pool_file只能是mode/trust_pool/verifier见 connpolicy.go 注释pem_file 报错文件里没有 CERTIFICATE 块或路径相对配置目录解析不到用绝对路径openssl x509 -in caddy.ca.cer -noout验证文件可读条件匹配不生效写了多条tls {}块却没写connection_policy条件必须配在match {}里纯tls {}块对所有连接生效到这里你的 Caddy 已经做到内网必验、公网放行的选择性 mTLS。觉得有用的话收藏备用配置里踩过的坑也欢迎留言交流。【免费下载链接】caddyFast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS项目地址: https://gitcode.com/GitHub_Trending/ca/caddy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻