簡體   English   中英

來自IBM的Watson助手API的javax.net.ssl.SSLHandshakeException

[英]javax.net.ssl.SSLHandshakeException from IBM's Watson assistant API

嘗試連接到IBM的Watson API時出現以下錯誤:

java.lang.RuntimeException: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
        at com.ibm.watson.developer_cloud.service.security.IamTokenManager.callIamApi(IamTokenManager.java:190)
        at com.ibm.watson.developer_cloud.service.security.IamTokenManager.requestToken(IamTokenManager.java:108)
        at com.ibm.watson.developer_cloud.service.security.IamTokenManager.getToken(IamTokenManager.java:78)
        at com.ibm.watson.developer_cloud.service.WatsonService.setAuthentication(WatsonService.java:375)
        at com.ibm.watson.developer_cloud.service.WatsonService.createCall(WatsonService.java:206)
        at com.ibm.watson.developer_cloud.service.WatsonService.createServiceCall(WatsonService.java:240)
        at com.ibm.watson.developer_cloud.assistant.v2.Assistant.createSession(Assistant.java:107)
        [...]
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
        at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:128)
        at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
        at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:308)
        at java.base/sun.security.ssl.Alert$AlertConsumer.consume(Alert.java:279)
        at java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:181)
        at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:164)
        at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1152)
        at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1063)
        at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:402)
        at okhttp3.internal.connection.RealConnection.connectTls(RealConnection.java:318)
        at okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.java:282)
        at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:167)
        at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:257)
        at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:135)

[...]

這是嘗試啟動API調用的Java代碼:

// Init assistant
IamOptions imaOptions = new IamOptions.Builder()
    .apiKey(API_KEY)
    .build();

assistant = new Assistant("2019-03-13", imaOptions);
assistant.setEndPoint(END_POINT_FRA);

// Create session
CreateSessionOptions options = new CreateSessionOptions.Builder(ASSISTANT_ID).build();
ServiceCall<SessionResponse> session = assistant.createSession(options);

在最后一行拋出異常。 有趣的是,通過獨立的單元測試運行此連接時,我能夠完美連接。 只有當我嘗試從服務器應用程序連接時才會收到此SSL錯誤。

我已經嘗試過以下方法:

  • 將所有必需的SSL證書導入應用程序的信任庫

  • 設置系統屬性以在TLS 1.1之前支持TLS 1.2

  • 驗證已安裝JCE完整策略文件(作為Java 11的一部分,這是我使用的版本)

  • 使用nmap驗證服務器的密碼套件並檢查它們是否受JDK支持(nmap -sV --script ssl-enum-ciphers -p 443 wildcard.bluemix.net)

我也閱讀並閱讀了這些文章:

收到致命警報:SSLHandshakeException中的handshake_failure

https://confluence.atlassian.com/jirakb/sslhandshakeexception-received-fatal-alert-handshake_failure-due-to-no-overlap-in-cipher-suite-943544397.html

我現在有點迷路了。 有什么想法可能導致SSL握手問題,或者如何進一步診斷它?

====更新====

在深入探討這個話題之后,我想我已經成功地將其隔離開了。 在Java 11.0.1中似乎是一個實際的錯誤,在11.0.2中也仍然存在。 根本原因是Java 11(OpenJDK)與TLSv1.3不兼容,如下所述: https ://webtide.com/openjdk-11-and-tls-1-3-issues/並在此處的錯誤報告中https://bugs.openjdk.java.net/browse/JDK-8213202

現在的問題是如何禁用TLSv1.3。 我已經嘗試過這里提供的解決方案https://blogs.oracle.com/java-platform-group/jdk-8-will-use-tls-12-as-defaulthttps://docs.oracle.com /javase/8/docs/technotes/guides/management/agent.html (協議和屬性),但是由於某種原因,這種禁用在我的情況下不會生效。 我的代碼使用的是org.apache.http.impl.client.ClosableHttpClient,並且Builder不允許我訪問基礎SSLConnectionSocketFactory(在這里我可以禁用TLSv1.3)。 所以,問題仍然存在:如何在此特定設置中禁用TLSv1.3?

(PS:嘗試訪問Google NL和Vision API時會出現問題 - language.googleapis.com和vision.googleapis.com)

JDK 11.0.1和11.0.2中存在與TLSv1.3有關的錯誤。 需要通過設置以下系統屬性來禁用此版本的TLS協議:

-Djdk.tls.client.protocols=TLSv1.1,TLSv1.2

據推測,這個bug將隨着JDK 11.0.3的發布而修復,該版本將於19年4月中旬發布。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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