2013-03-23 42 views
2

我们公开了部署在负载均衡器后面的Tomcat实例上的webservice。 负载均衡器只允许HTTPS流量,但Jax-ws终点指向HTTP WSDL URL而不是HTTPS。当客户端访问Loadbalancer HTTPS URL时,它将被重定向到HTTP,并且由于HTTP上的流量被阻塞在LB上,客户端会因为WSDL无法访问而出现错误。JAX-WS Webservices,具有HTTPS端点URL而不是HTTP的负载均衡器

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, Please see the HTTPS protocol in Browser and HTTP in the WSDL location URL, I have removed the Service and url's due to security reasons

这将是巨大的,如果有些能在正确的方向指向我。

请阅读注释过在不同场景解决方案

+0

您是否尝试过指向SSL版本的WSDL,而不是基于http:// server:port/web_service?WSDL创建客户端,请使用https:// server:ssl_port/web_service?WSDL ? WSDL的SSL版本应该在部署WS时自动创建(如果配置了服务器SSL)。 – Xargos 2013-03-25 07:57:23

+0

我指向LoadBalancer的HTTPS url,但正如您在上图中所看到的,WSDL url指向HTTP – John 2013-03-25 13:41:41

回答

1

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

如果你仍然想在Tomcat上设置SSL,那么你首先必须设置密钥库 - 你的密钥和证书的“数据库”。网上有很多教程如何操作,一个是here。然后,你需要加入这个片段来改变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,应该这样做。

+0

正如您所提到的,我不想在LoadBalancer和Server之间进行SSL通信,我只有纯HTTP通信在LB和服务器之间。但是,当我访问LoadBalancer Ex的HTTPS url时:https:// myloadbalalncer/Application/TestService,从JAX-WS生成的End-Point Page:WSDL url指向LoadBalancer的HTTP URL,由于http从客户端禁用到LB,客户端得到一个不可访问的WSDL错误 – John 2013-03-25 13:40:07

+0

@John在你的情况下,似乎平衡器只是重定向HTTP端口上的流量。如果配置正确,负载平衡器应该是透明的,客户端应该不知道它的存在。尝试以不同的方式对其进行配置:或者只是将HTTPS传递到服务器(在这种情况下,您需要在Tomcat上启用SSL),或者(更好地)终止SSL连接并使用普通HTTP与服务器通信 - 而不仅仅是重定向HTTP你的情况目前。 – 2013-03-25 15:17:09

+0

Hi Miljen,我们需要实现您的第一个建议,客户端和LB之间的HTTPS以及LB和服务器之间的HTTP。但是,我们有和约翰一样的问题。 WSDL描述符指向HTTP而不是HTTPS,因此来自客户端的“第二个”调用是http:// ...所以它不起作用。如果你能举一个关于如何实现你的第一个建议的例子,我会非常感激。 – gguardin 2013-03-26 01:02:21

1

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

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

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

当客户端使用HTTPS连接到LB到端口443这将工作,LB使用HTTP端口8080在这种情况下,WSDL返回

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

重要的事情有

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

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

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

谢谢奇诺谁帮助我们这个!

+0

有趣。当我们重定向到端口8443时,8443的连接器配置是否应包含密钥存储和别名,Ex如下所示: John 2013-03-29 18:34:45

+0

您只需要这一行,不需要将另一个连接器添加到端口8443,因为不会有需要强制SSL到服务器的请求,因此重定向会赢得'我们打电话来。 – gguardin 2013-03-31 19:12:35

+0

谢谢,另一个很好的解决方案 – John 2013-04-01 00:47:49