3

我们已经公开了一个部署在负载均衡器后面的 Tomcat 实例上的 Web 服务。负载平衡器仅允许 HTTPS 流量,但 Jax-ws 端点指向 HTTP WSDL url 而不是 HTTPS。当客户端访问负载均衡器 HTTPS URL 时,它会被重定向到 HTTP,并且由于流量是 HTTP 在 LB 上被阻止,客户端会收到错误,因为 WSDL 不可访问。

sun-jaxws.xml 或 webservice 注释中是否有任何配置来指定告诉 JAX-WS 公开 HTTPS url 而不是 HTTP。

下面是我的配置:

sun-jaxws.xml:

<?xml version="1.0" encoding="UTF-8"?>
<endpoints
xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime'
version='2.0'>
<endpoint
    name='/TestService'
    implementation='com.test.service.TestServiceImpl'
    url-pattern='/TestService' />    

Annotation Config On WebService Impl class:

@WebService(serviceName="TestServiceImpl",
portName="TestService",
endpointInterface = "com.test.service.TestService",
targetNamespace="http://test.com"
)
@HandlerChain(file = "handlers.xml")
@MTOM
@XmlAccessorType(XmlAccessType.PROPERTY)
public class TestServiceImpl implements TestService{
//Implementation
}

WebService End-Point,请查看浏览器中的 HTTPS 协议和 WSDL 位置 URL 中的 HTTP,出于安全原因,我已删除服务和 url

如果有人能指出我正确的方向,那就太好了。

不同场景下的解决方案也请阅读评论

4

2 回答 2

2

我不建议这种方法 - 更好的选择是终止负载均衡器上的 SSL 通信,并在负载均衡器和服务器之间使用纯 HTTP(除非您还需要保护均衡器和服务器之间的流量,但我对此表示怀疑) )。也就是说,您不必在两个地方都设置 SSL,并且当某些东西无法正常工作时,您会感到头疼。因此,首先尝试以这种方式配置负载均衡器。此外,您必须手动重写<soap:address location="..">WSDL 中的标签(当然,添加 HTTPS 地址)并从本地存储的 WSDL生成 WS 客户端。

如果您仍想在 Tomcat 上设置 SSL,那么您首先必须设置密钥库 - 您的密钥和证书的“数据库”。Web上有很多教程如何做到这一点,一个在这里。然后,您需要通过添加以下代码段来更改 Tomcat 的 server.xml 文件:

 <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           keystoreFile="<PATH-TO-KEYSTORE>" keystorePass="<YOUR-KEYSTORE-PASSWORD>"
           clientAuth="false" sslProtocol="TLS"/>

最后,您需要指定您的 Web 服务将所有 HTTP 请求重定向到 HTTPS 侦听器 - 但在 web.xml 文件中,而不是在 sun-jaxws.xml 中:

<user-data-constraint>
    <transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>

重新启动 Tomcat 就可以了。

于 2013-03-25T07:54:54.463 回答
2

另一种方法是在 Tomcat 的“server.xml”文件中添加这样一行

<Connector URIEncoding="UTF-8" port="8080" protocol="HTTP/1.1" 
    connectionTimeout="20000"  scheme="https" proxyPort="443"
    redirectPort="8443" />

在这种情况下,使用 HTTP 将 LB 指向端口 8080。

当客户端使用 HTTPS 到端口 443 连接到 LB,LB 使用 HTTP 到端口 8080 连接到服务器时,这将起作用。在这种情况下,WSDL 返回

<soap:address location="https://www.yoursite.com:443/...">

重要的事情有

方案:将此属性设置为您希望通过调用request.getScheme()返回的协议的名称。例如,您可以将此属性设置为 SSL 连接器的“https”。默认值为“http”。

proxyPort:如果在代理配置中使用此连接器,请配置此属性以指定为调用request.getServerPort()所返回的服务器端口。

Jax-ws 使用粗体显示的两种方法来构建soap:address。

感谢 Chino 帮助我们!

于 2013-03-27T21:27:29.123 回答