当前位置: 首页 > 知识库问答 >
问题:

来自IBM Watson assistant API的javax.net.ssl.SSLHandShakeException

百里意智
2023-03-14

在尝试连接到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)
// 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证书导入应用程序的信任存储

    将系统属性设置为支持TLS 1.1之前的TLS 1.2

    使用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握手问题,或者我如何进一步诊断它?

    ====更新====

    在围绕这个话题挖掘之后,我想我已经设法把它孤立了。它似乎是Java11.0.1中的一个实际bug,在11.0.2中仍然存在。根本原因是Java11(OpenJDK)不能很好地使用TLSV1.3,如下所述:https://webtide.com/openjdk-11-and-tls-1-3-issuess/和下面的bug报告https://bugs.OpenJDK.Java.net/browse/jdk-8213202

    现在的问题是如何禁用TLSV1.3。我已经尝试了这里提供的解决方案https://blogs.oracle.com/java-platform-group/jdk-8-will-use-tls-12-as-default和这里提供的解决方案https://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html(协议和属性),但是由于某种原因,这种禁用在我的情况下并不生效。我的代码使用的是org.apache.http.impl.client.ClosableHttpClient,构建器不允许我访问底层的SSLConnectionSocketFactory(在这里我可以禁用TLSV1.3)。因此,问题仍然存在:如何在此特定设置中禁用TLSv1.3?

    (PS:当试图访问Google NL和Vision APIs时也会出现这个问题--language.googleapis.com和Vision.googleapis.com)

  • 共有1个答案

    岳彬炳
    2023-03-14

    JDK 11.0.1和11.0.2中存在一个与TLSV1.3相关的bug。需要通过设置以下系统属性来禁用此版本的TLS协议:

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

    据推测,这个bug将在19年4月中旬发布的JDK 11.0.3中得到修复。

     类似资料:
    • 问题内容: 使用的我可以将任意的数据到数据的URL。有没有办法使用内置的浏览器API 将数据URL转换回实例? 问题答案: 用户Matt一年前提出了以下代码如何在javascript中将dataURL转换为文件对象?,这可能对您有帮助 编辑:正如一些评论者所报道的,BlobBuilder已被弃用了一段时间。这是更新的代码:

    • 问题内容: 由于某种原因,登录完成后无法重定向到/ blog。在我的登录控制器中,我有以下内容。 jQuery Ajax 更新为工作代码 问题答案: AJAX之后,您将无法进行重定向。您需要自己使用Javascript完成。 服务器 客户 这应该工作。

    • 使用的我可以将任意数据转换为Data URL。有没有办法使用内置浏览器apis将Data URL转换回实例?

    • 以前,我在Red Hat提供的Oracle Java SE中使用JavaFX开发应用程序,但似乎不再提供JavaFX了,如https://access.redhat.com/articles/3253281。然而,似乎来自rhel-7-server-rpms存储库的OpenJDK并不是JavaFX附带的。 是否有更好的方法来代替仅仅从Red Hat提供的存储库之外安装包?我不想用自编译的OpenJ

    • 这是我的第一个帖子。作为一名初出茅庐的Android开发者,我几乎每天都在阅读各种主题的SO帖子,但对于这个问题,我没有从谷歌那里找到任何帮助。 我到目前为止的研究: 搜索这个问题比正常情况要难,因为搜索引擎似乎不关心大小写敏感性,而大小写敏感性在这个问题中是至关重要的。搜索谷歌只给了我类本身的链接,旧文章,或者完全不相关的文章。我得到的最接近的是JSONArray和JSONObject,这是一个

    • 问题内容: 我正在尝试升级到最新的Java Mail实用程序。 从 到(我的意图) 但我找不到用于邮件工件的1.5.1, 但我可以看到 我的问题是为什么更改组ID,如果我更改了1.5.1的组ID,我是否需要更改所有已经存在的邮件实现(程序包名称更改和其他任何内容),vs 和有什么区别? 问题答案: Maven坐标在一段时间前更改为与此处描述的方案兼容。新的坐标在这里。 简而言之: groupId

    • 问题内容: 我想像本例一样启用蓝牙。 但是,我的课程不是Activity,而是Service,因此我不能调用startActivityForResult。我怎么解决这个问题?。我知道还回答了其他问题,例如 使用非活动中的startActivityForResult 但这不能解决我的问题,因为我的应用程序由服务组成,而没有别的什么。 问题答案: 不幸的是你不能那样做。 我发现(破解)的唯一解决方案是