You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 04:32:03