【问题标题】:SSL HandShake exceptionSSL 握手异常
【发布时间】:2011-04-16 02:02:51
【问题描述】:

我使用 SSL 连接将 Web 客户端连接到服务器。它可以长时间工作而没有任何问题。但是从昨天开始,它给出了以下错误,谁能告诉我原因。

javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.checkEOF(SSLSocketImpl.java:1172)
        at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:65)
        at net.schubart.fixme.internal.MessageInput.readExactly(MessageInput.java:166)
        at net.schubart.fixme.internal.MessageInput.readMessage(MessageInput.java:78)
        at cc.aot.itsWeb.ClientWriterThread.run(ClientWriterThread.java:241)
        at java.lang.Thread.run(Thread.java:619)
clientWriter.ready
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1586)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:865)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1029)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:621)
        at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)
        at java.io.OutputStream.write(OutputStream.java:58)
        at net.schubart.fixme.internal.Message.write(Message.java:267)
        at net.schubart.fixme.internal.MessageOutput.writeMessage(MessageOutput.java:53)

【问题讨论】:

  • 你有服务器日志吗?它是“单向 SSL”(没有用户证书)还是您对您的客户端进行身份验证?您可以使用网络浏览器连接此服务器吗?服务器证书有效吗?

标签: java ssl


【解决方案1】:

您遇到的问题与证书有关。以下是在使用安全 SSL 程序之前您可能需要熟悉的事项列表。必须有一个信任库、密钥库,并且必须添加证书。 要将密钥添加到您的 cacerts 文件中,如步骤 6 中所示,计算机可能会要求您输入您不知道的密码。最有可能是“改变”

1) 使用相应的公钥/私钥创建新的密钥库和自签名证书:

 keytool -genkeypair -alias "username" -keyalg RSA -validity 7 -keystore keystore

2) 检查密钥库:

keytool -list -v -keystore keystore

3) 导出并检查自签名证书:

keytool -export -alias "username" -keystore keystore -rfc -file "username".cer

4) 将证书导入新的信任库:

keytool -import -alias "username" -file "username".cer -keystore truststore

5) 检查信任库:

keytool -list -v -keystore truststore

6) 添加到密钥库(这是您要查找的内容):

sudo keytool -import -file "username".cer -alias "username" -keystore "path-to-keystore"

在某些系统上,这可以在

中找到
/usr/lib/jvm/<java version folder>/jre/lib/security/cacerts

在其他系统上类似于

/etc/ssl/certs/java/cacerts

如果您需要更多说明,请查看 Git-Hub 上的此项目: https://github.com/rabbitfighter81/JSSLInfoCollectionServer 这是一个帮助键的shell脚本。 https://github.com/rabbitfighter81/SSLKeytool

【讨论】:

    【解决方案2】:

    我在这个问题上花了超过 12 个小时。创建自签名证书后,需要将该证书导出到cacert 文件。就我而言,它位于/usr/lib/java/jre/lib/security/cacert。您可以使用keytool 导出证书(您可能必须具有root 访问权限):

    $ sudo keytool -exportcert -alias keyStoreAlias -keystore \
           keyStoreKeys.keys -file /usr/local/java/jre/lib/security/cacerts
    

    【讨论】:

      【解决方案3】:

      服务器提供的证书不受信任。这可能是由于证书已过期,或者信任管理器无法为您的信任库中的任何证书建立信任链。

      【讨论】:

        【解决方案4】:

        检查证书是否有效,您可以使用浏览器执行此操作。

        【讨论】:

          【解决方案5】:

          如果您真的需要,您可以接受所有证书。但请记住,这真的很难看。

          看看this

          【讨论】:

            【解决方案6】:

            我会先检查相关证书是否已过期。在与供应商合作时遇到过很多次。他们可以在不通知我们的情况下更新他们的证书。

            【讨论】:

              【解决方案7】:

              此“certificate_unknown”是一条非常具有误导性的错误消息。这与证书过期时引发的错误消息相同,即使它在信任库中也是如此。我建议您在将时间浪费在其他任何事情上之前检查证书的到期日期。

              【讨论】:

                【解决方案8】:

                您可以通过浏览器查看证书。

                在 Internet Explorer 中

                Right Click >> Properties >> Certificates
                

                进入证书窗口后,您还可以查看整个证书树。

                如果您的证书无效,您可能需要使用keytool 命令查看解决方案。

                Keytool Commands

                【讨论】:

                  【解决方案9】:

                  我认为您必须在jre1.6 cacert 中添加密钥库。然后再次部署你的服务器。顺便添加keystorePORTECLE程序。很有用。

                  【讨论】:

                    【解决方案10】:

                    当我收到此错误时,问题是服务器证书使用签名算法 SHA1withRSA 和 Android 8.0 客户端。切换到基于 SHA256withRSA 的服务器证书解决了该问题。

                    【讨论】:

                      【解决方案11】:

                      我通过从 jdk 1.7 更改为 jdk 1.8 来修复 SSL 握手异常。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2015-07-30
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2018-04-08
                        • 2017-04-24
                        • 2015-07-24
                        相关资源
                        最近更新 更多