【问题标题】:SSL handshake exception while connecting over https通过 https 连接时出现 SSL 握手异常
【发布时间】:2017-05-09 07:25:01
【问题描述】:

当端点 URL 中包含 IP 地址时,我的 java 应用程序能够使用 https SSL 连接连接到第三方应用程序。 现在,当 IP 地址更改为主机名 时,我得到 “SSL 握手异常”。 除此之外,没有代码更新或任何其他更改。 唯一改变的是第三方在端点 URL 中使用主机名,而不是 IP 地址。

之前的网址:https://10.0.0.1:5368/invoke/Upload.Accept/receiveReply 现网址:https://service.serviceprovider.com:5368/invoke/Upload.Accept/receiveReply

任何想法是什么导致了这个问题以及如何解决它?

如果需要更多详细信息,请告诉我。

以下是错误的堆栈跟踪:

javax.net.ssl.SSLHandshakeException: Could not generate secret
        at sun.security.ssl.DHCrypt.getAgreedSecret(DHCrypt.java:219)
        at sun.security.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:1056)
        at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:348)
        at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1026)
        at sun.security.ssl.Handshaker.process_record(Handshaker.java:961)
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
        at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153)
        at com.etsalat.adapter.sadad.PaymentLoadAdapter.run(PaymentLoadAdapter.java:130)
        at java.lang.Thread.run(Thread.java:748)

     Caused by: java.security.NoSuchAlgorithmException: TlsPremasterSecret SecretKeyFactory not available
        at javax.crypto.SecretKeyFactory.<init>(SecretKeyFactory.java:122)
        at javax.crypto.SecretKeyFactory.getInstance(SecretKeyFactory.java:160)
        at iaik.security.dh.DHKeyAgreement.engineGenerateSecret(Unknown Source)
        at javax.crypto.KeyAgreement.generateSecret(KeyAgreement.java:648)
        at sun.security.ssl.DHCrypt.getAgreedSecret(DHCrypt.java:217)

【问题讨论】:

  • 您只需更改 url 并期望它像以前一样工作。 SSL 证书是针对特定 url 颁发的,如果您更改 url,则必须为新 url 颁发新证书并配置您的应用程序以使用该证书。
  • 我的意思是你不能只是改变......
  • @OleksandrShpota 这些都不能解释“无法生成秘密”。如果握手达到ServerHelloDone,则证书被接受。
  • @OleksandrShpota :我认为自从 ServerHelloDone 完成后,它不应该是证书错误。是否有验证特定 URL 的证书?
  • @siddharthachakraborty 你可以运行openssl s_client -connect service.serviceprovider.com:5368 -showcerts 并检查输出中的“主题”部分。

标签: java web-services ssl https ssl-certificate


【解决方案1】:

我之前也遇到过同样的问题。

如果您使用的数字签名 API 未添加到您的应用程序使用的 Java SDK 中,则会出现异常:“SecretKeyFactory 不可用”。

要将 API 添加到 Java SDK: 1. 导航到 lib-signed 文件夹,然后将 API jar 文件(例如:iaik_jce.jar)复制到 /jre/lib/ext。 2.导航到/jre/lib/security,然后将以下内容添加到java.security security.provider.10=iaik.security.provider.IAIK 注意:如果另一个条目正在使用数字“10”,请使用下一个可用的数字。

更多信息请参考:http://docs.oracle.com/cd/E61144_01/English/Install_and_Config/Automatic_Install_and_Config/helpmain.htm?toc.htm?89631.htm

【讨论】:

    猜你喜欢
    • 2017-03-30
    • 2018-10-17
    • 1970-01-01
    • 2016-09-28
    • 2011-04-16
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多