【问题标题】:WSDL binding URL changes protocol to HTTP when behind an SSL termination在 SSL 终止之后,WSDL 绑定 URL 将协议更改为 HTTP
【发布时间】:2019-02-04 07:23:02
【问题描述】:

我们有一个简单的 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 终端后面,因此在外部,该服务及其 WSDL 可在 https://external-name 获得。

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

最糟糕的是,我们的服务不能被我们合作伙伴的 SOA 使用,它强制使用来自 WSDL 的已发布位置。

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

【问题讨论】:

  • 您是否设置/配置了ForwardedRequestCustomizerSecureRequestCustomizer 以适应这种情况?您是否还在服务器上设置了HttpConfiguration 以指示哪个端口是安全的?
  • @JoakimErdfelt 在自托管模式下,我(几乎)对嵌入式 Jetty 没有影响,我只能自定义此处公开的内容:cxf.apache.org/schemas/configuration/http-jetty.xsd。我没有组装服务器或使用 spring,我只是使用简单的Endpoint.publish 并让 CXF 使用嵌入式 Jetty 来做它的事情。
  • 根据 xsd,您的 JettyHTTPServerEngineConfigType.connector 条目可以通过连接器特定的 HttpConfiguration 条目添加所需的定制器。
  • 我认为这需要比我拥有的 Jetty 和 CXF 的深层内部知识更深入的知识。由于其简单性,我们选择了自托管,但似乎我们无法避免构建一个成熟的 Spring 应用程序。

标签: soap wsdl cxf jax-ws embedded-jetty


【解决方案1】:

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

【讨论】:

  • 但是如何将该配置应用到我在代码 javax.xml.ws.Endpoint.publish(address, implementor) 中创建的端点?
  • 找到它:org.apache.cxf.jaxws.EndpointImpl.setPublishedEndpointUrl。可以,只需要在调用publish之前设置,否则没有效果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 2012-11-04
  • 2015-02-14
  • 2020-05-08
  • 1970-01-01
  • 2014-03-11
相关资源
最近更新 更多