【发布时间】: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 密钥库维护噩梦,并且必须在服务器实例中存储公司范围的证书 + 私钥)。
【问题讨论】:
-
您是否设置/配置了
ForwardedRequestCustomizer和SecureRequestCustomizer以适应这种情况?您是否还在服务器上设置了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