Spring Boot 的双向 TLS(mTLS)要求客户端和服务端在握手时彼此验证证书。配置的关键不是简单把 server.ssl.enabled=true,而是服务端同时拥有私钥/证书和用于验证客户端证书的信任材料,并明确客户端证书与业务身份怎样映射。
先弄清单向 TLS 与 mTLS
普通 HTTPS 客户端验证服务器证书;mTLS 额外要求服务器验证客户端证书。启用 server.ssl.client-auth=need 这类要求之前,先建立受信任的客户端 CA 或明确受信的客户端证书链,否则所有未提交有效证书的客户端都会在握手时失败。

配置 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 故障排查。
按顺序执行的检查清单
- 确认 Spring Boot 版本与 TLS 终止点在应用还是网关。
- 为服务端和客户端分别准备可信证书链/私钥,保护密码与文件权限。
- 设置服务端证书及客户端 CA TrustStore,启用要求客户端证书的配置。
- 用受信、过期、无证书和错误 CA 四种客户端分别测试握手。
- 建立证书轮换、身份映射、失效报警及网关头注入防护。
可直接复核的命令或配置示例
以下命令只用于对应系统和实际配置的核查;包含示例域名、路径或版本的地方,应先按自身环境替换并确认权限。
# 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 绕过验证。
官方资料与核查入口
以下列出可交叉核对的技术资料或服务条款;实际部署还须以所用软件版本、正式合同和自身环境测试为准。



