2013-03-23 26 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