[英]Java Spring WS client - tomcat or apache interfering?
最近,一家供應商升級了他們的XML SOAP Web服務,放棄了對TLSv1的支持,這導致我們對其的呼叫停止工作。
我對舊版Java Spring應用程序進行了略微升級,以嘗試重新啟用該功能。 我有以下代碼;
public boolean searchViaWS(....) throws Exception {
SaajSoapMessageFactory messageFactory = new SaajSoapMessageFactory(MessageFactory.newInstance());
messageFactory.setSoapVersion(SoapVersion.SOAP_11);
XmlBeansMarshaller marshaller = new XmlBeansMarshaller();
// THESE TWO LINES ARE NEW TO SUPPORT TLSv1.1
HttpsUrlConnectionMessageSender sender = new HttpsUrlConnectionMessageSender(); // NEW
sender.setSslProtocol("TLSv1.1"); // NEW
NSCHWebServiceClient webServiceClient = new NSCHWebServiceClient(messageFactory);
webServiceClient.setMessageSender(sender); // NEW ALSO
webServiceClient.setMarshaller(marshaller);
webServiceClient.setUnmarshaller(marshaller);
return webServiceClient.searchViaWS(....);
}
webServiceClient所做的只是基於wsdl構建對象,然后調用WebServiceTemplate.marshalSendAndReceive。
現在,我可以通過Eclipse中的單元測試來執行此代碼。
在Eclipse中,類路徑表示它正在使用JavaSE-1.6(由jdk1.7.0_21提供)
但是,當我將代碼上載到服務器時,該服務器使用ajp運行Apache並在運行Java 1.6.0_0的CentOS機器上重定向到Tomcat 6.0.29,並執行相同的代碼,因此ssl握手異常會繼續。
該項目及其服務器非常遺留問題,在最佳情況下,我還沒有完全了解傳輸協議。 我是否懷疑服務器上的Tomcat和/或Apache忽略了Java代碼使用TLSv1.1的請求,因此仍然使用TLSv1並導致與遠程服務器的握手錯誤?
終於找到了解決辦法。 正如我所懷疑的,Tomcat引起了問題。 我在服務器上升級到Java 7,然后將以下內容添加到tomcat bin目錄中的catalina.sh中;
JAVA_OPTS="$JAVA_OPTS -Dhttps.protocols=TLSv1.1,TLSv1.2"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.