簡體   English   中英

Java Spring WS客戶端-Tomcat還是Apache干擾?

[英]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中的單元測試來執行此代碼。

  • 如果沒有上述新行,則測試會失敗,並帶有ssl握手異常,表示遠程主機已關閉連接,這可能是因為它們不再允許TLSv1。
  • 有了以上測試中的NEW行,就可以從遠程服務器獲得成功的響應。 因此,我認為僅需將協議設置為TLSv1.1。

在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM