如何基于Vert.x WebClient实现mTLS?解决证书链为空报错
Vert.x WebClient 正确实现mTLS解决证书链为空问题
服务器抛出javax.net.ssl.SSLHandshakeException: Empty client certificate chain,核心原因是服务器启用了强制客户端证书验证(ClientAuth.REQUIRED),但客户端未正确发送有效的证书链,或服务器未信任客户端证书。以下是修正方案:
一、核心配置要点
- 客户端必须提供完整的身份证书链:确保客户端证书文件包含自身证书及所有中间CA证书(若为CA签发),私钥文件与证书匹配。
- 服务器需信任客户端证书:服务器要配置信任客户端的CA根证书或客户端证书本身,否则会拒绝客户端的证书。
- 避免滥用
setTrustAll(true):该配置仅适合测试环境,生产环境需明确指定信任的证书,避免安全风险。
二、修正后的服务器代码
HttpServerOptions options = new HttpServerOptions() .setSsl(true) .setClientAuth(ClientAuth.REQUIRED) // 服务器自身的密钥与证书 .setPemKeyCertOptions(new PemKeyCertOptions() .addCertPath(path + "/server-cert.pem") .setKeyPath(path + "/server-key.pem")) // 配置信任客户端的CA证书或客户端证书 .setPemTrustOptions(new PemTrustOptions() .addCertPath(path + "/client-ca.pem")); HttpServer server = vertx.createHttpServer(options);
三、修正后的客户端代码
WebClientOptions options = new WebClientOptions() .setSsl(true) // 客户端身份验证用的密钥与完整证书链 .setPemKeyCertOptions(new PemKeyCertOptions() .addCertPath(path + "/client-cert.pem") .setKeyPath(path + "/client-key.pem")) // 信任服务器的证书或CA根证书 .setPemTrustOptions(new PemTrustOptions() .addCertPath(path + "/server-cert.pem")); WebClient client = WebClient.create(vertx, options);
四、额外注意事项
- 证书文件格式必须为PEM格式,若私钥有密码保护,需额外调用
setKeyPassword配置密码。 - 若使用自签名证书,客户端和服务器需互相添加对方的证书到信任列表中。
内容的提问来源于stack exchange,提问作者ron
相关产品推荐
相关产品推荐

