记录主机体验,分享建站经验RSS 订阅 ↗

Spring Boot 双向 TLS(mTLS)配置:证书信任、客户端认证与验证

更新于 2026-10-24

Spring Boot 的双向 TLS(mTLS)要求客户端和服务端在握手时彼此验证证书。配置的关键不是简单把 server.ssl.enabled=true,而是服务端同时拥有私钥/证书和用于验证客户端证书的信任材料,并明确客户端证书与业务身份怎样映射。

先弄清单向 TLS 与 mTLS

普通 HTTPS 客户端验证服务器证书;mTLS 额外要求服务器验证客户端证书。启用 server.ssl.client-auth=need 这类要求之前,先建立受信任的客户端 CA 或明确受信的客户端证书链,否则所有未提交有效证书的客户端都会在握手时失败。

Spring Boot mTLS 双向认证操作流程:服务端证书、客户端证书、双向信任链、身份与授权、轮换及回退
Spring Boot mTLS 双向认证的五个关键环节,非实测数据。

配置 KeyStore 与 TrustStore

服务器的密钥库包含自身私钥和证书链,信任库包含允许的客户端 CA 或证书。Spring Boot 新版本支持 SSL bundle 管理 PEM/JKS/PKCS12 资料;不同 Spring Boot 版本的属性路径不完全相同,应以当前项目版本官方文档核对,避免粘贴过时配置。

关于“HTTPS 证书负责什么”的相关说明,可以参考数字证书适用场景与局限:HTTPS、代码签名和客户端身份认证。

客户端也需要证书与身份策略

Java HttpClient/RestClient 或网关需要提供匹配的客户端证书链和私钥,并验证服务器主机名。证书认证成功仅表示其被信任,还需在应用层将证书 Subject/SAN 或 SPIFFE 标识映射到允许的服务权限,并考虑撤销、有效期和轮换。

部署在 Nginx 或网关后的注意点

TLS 可能在边缘反向代理终止;如果客户端验证发生在 Nginx 而不是 Spring Boot,后端不应盲信来自公网的 X-Client-Cert 请求头,必须通过受信内网与签名/认证传递验证后的身份。调试时不要使用全局关闭证书校验的“TrustAll”。

关于“检查主机名与证书链”的相关说明,可以参考SSL 证书配置如何验证:OpenSSL、证书链与 SNI 故障排查。

按顺序执行的检查清单

  1. 确认 Spring Boot 版本与 TLS 终止点在应用还是网关。
  2. 为服务端和客户端分别准备可信证书链/私钥,保护密码与文件权限。
  3. 设置服务端证书及客户端 CA TrustStore,启用要求客户端证书的配置。
  4. 用受信、过期、无证书和错误 CA 四种客户端分别测试握手。
  5. 建立证书轮换、身份映射、失效报警及网关头注入防护。

可直接复核的命令或配置示例

以下命令只用于对应系统和实际配置的核查;包含示例域名、路径或版本的地方,应先按自身环境替换并确认权限。

# Spring Boot 属性名称须核对当前版本,以下为经典 server.ssl.* 思路
server.ssl.enabled=true
server.ssl.key-store=classpath:server.p12
server.ssl.key-store-type=PKCS12
server.ssl.trust-store=classpath:client-ca.p12
server.ssl.trust-store-type=PKCS12
server.ssl.client-auth=need
# 密码请通过受保护的环境变量/密钥管理系统注入,不写在配置文件

常见问题

配置 server.ssl.enabled=true 就是 mTLS 吗?

不是,默认普通 TLS 不一定要求客户端证书。

mTLS 证书通过后还需用户权限吗?

通常需要,传输层认证与应用授权并非同一层。

风险、限制与验收口径

真实私钥、KeyStore 密码和生产 CA 不能写入公开代码;证书错误时不得用 trustAll 绕过验证。

官方资料与核查入口

以下列出可交叉核对的技术资料或服务条款;实际部署还须以所用软件版本、正式合同和自身环境测试为准。