WSDL 绑定 URL 在 SSL 终止后将协议更改为 HTTP

WSDL binding URL changes protocol to HTTP when behind an SSL termination

我们有一个简单的 jax-ws SOAP 服务器,由 Apache CXF 3.2.6 支持,处于独立(自托管)模式,使用嵌入式 Jetty。服务器是使用 CXF 的 wsdl2java 生成的 wsdl-first。 WSDL 是类路径上的文件,并且该物理 WSDL 文件在 soapbind:address 元素的 location 属性中具有 https://....

启动时,服务器发布到 http://0.0.0.0:8080。服务器还位于路由 https://external-name -> SSL 终止 -> http://internal-name:8080 的 SSL 终止之后,因此在外部可以在 https://external-name.

获得该服务及其 WSDL

问题是,当通过 https://external-name?wsdl 从部署的服务器请求 WSDL 时,CXF 将结果文件中 soapbind:address 元素的 location 属性更改为 http://external-name(将协议从 HTTPS 更改为 HTTP 并保留其他所有内容),这会导致生成客户端代理、Soap UI 等问题

最糟糕的是,我们的合作伙伴的 SOA 无法使用我们的服务,该 SOA 强制使用 WSDL 中的已发布位置。

除了删除 SSL 终止并让 CXF 自行处理 SSL 之外,我们如何解决这个问题? (这太可怕了,因为 Java 密钥库维护噩梦并且必须在服务器实例中存储公司范围的证书 + 私钥)。

您可以在配置中将所需的地址设置为publishedEndpointUrl。参见:http://cxf.apache.org/docs/jax-ws-configuration.html