
本文详解因 jdk 升级后 ssl 证书信任链缺失,导致 apache cxf 的 `cxf-codegen-plugin:wsdl2java` 在解析远程 wsdl/xsd 时抛出 `pkix path building failed` 错误的根因与完整解决方案。
该错误本质是 JDK 的信任库(cacerts)中缺少目标 HTTPS 服务(https://siemops-test.siemens-energy.com)所用 TLS 证书的可信根证书或中间证书,导致 wsdl2java 在解析 WSDL 中引用的远程 XSD(如 ?xsd=xsd5)时,SSL 握手失败:
javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
尽管你已尝试升级 CXF(至 3.4.5)或切换 Zulu JDK 小版本(如 8.56 → 8.64),但问题未解——因为这是 JDK 级别的证书信任问题,与 CXF 版本无关。新版本 Zulu JDK(尤其是 8.64+)默认启用了更严格的证书验证策略,且其 cacerts 未预置企业内网或私有 CA 签发的证书。
✅ 正确解决方案:将目标站点证书导入 JDK 的 cacerts 信任库。
步骤一:导出目标站点证书
- 在浏览器中访问 https://siemops-test.siemens-energy.com/SDPService_DEV/SDPSiemopsService.svc?wsdl(确保地址可访问);
- 点击地址栏锁形图标 → “连接安全” → “证书” → 切换到“详细信息”选项卡 → 点击“复制到文件…” → 选择“Base-64 编码 X.509 (.CER)”格式,保存为 siemops-test.cer(例如:C:\certs\siemops-test.cer)。
⚠️ 注意:若站点使用通配符证书或由内部 CA 签发,请确保导出的是根证书或完整的证书链(推荐导出整个证书路径中的“根证书”)。
步骤二:定位 JDK 的 cacerts 文件
Zulu JDK 的默认信任库路径为:
立即学习“Java免费学习笔记(深入)”;
{JAVA_HOME}\jre\lib\security\cacerts例如:
C:\Program Files\Zulu\zulu-8\jre\lib\security\cacerts
确认当前 Maven 使用的 JDK(通过 mvn -version 或 IDE 设置),确保操作的是该 JDK 的 cacerts。
步骤三:使用 keytool 导入证书
以管理员权限打开命令行,执行:
"%JAVA_HOME%\bin\keytool" -import -trustcacerts -alias siemops-test -file "C:\certs\siemops-test.cer" -keystore "%JAVA_HOME%\jre\lib\security\cacerts" -storepass changeit
- -alias:自定义别名(建议具描述性);
- -storepass changeit:cacerts 默认密码为 changeit(如已修改请替换);
- 执行后会提示“是否信任此证书?[否/是]”,输入 yes 确认。
✅ 验证是否成功:
"%JAVA_HOME%\bin\keytool" -list -v -keystore "%JAVA_HOME%\jre\lib\security\cacerts" -alias siemops-test
补充建议(提升健壮性)
- ✅ CI/CD 环境:将证书导入步骤写入构建脚本(如 Jenkins pipeline),或通过 -Djavax.net.ssl.trustStore=... 指定自定义 truststore;
- ✅ 多环境管理:避免直接修改系统 cacerts,可创建专用 truststore 并在 Maven 中配置插件 JVM 参数:
org.apache.cxf cxf-codegen-plugin -Djavax.net.ssl.trustStore=C:/certs/my-truststore.jks -Djavax.net.ssl.trustStorePassword=mypassword - ❌ 不推荐方案:禁用 SSL 验证(如 -Dcom.sun.net.ssl.checkRevocation=false 或自定义 TrustManager),违反安全最佳实践,禁止用于生产环境。
完成上述操作后,重新运行 mvn clean generate-sources,wsdl2java 将能成功下载并解析远程 XSD,构建即可恢复正常。











