我使用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)
答案 0 :(得分:8)
我在这个问题上花了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
答案 1 :(得分:6)
您遇到的问题是证书。以下列出了在使用安全SSL程序之前可能需要熟悉的事项。必须有信任库,密钥库,并且必须添加证书。 要将密钥添加到cacerts文件中,如步骤6所示,计算机可能会要求您提供您不知道的密码。它是" changeit"最可能的
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 :(得分:3)
服务器提供的证书不受信任。这可能是由于证书过期,或者信任管理器无法与您信任库中的任何证书建立信任链。
答案 3 :(得分:2)
检查证书是否有效,您可以使用浏览器执行此操作。
答案 4 :(得分:2)
如果你真的需要,你可以接受所有证书。但请记住,这真的很难看。
Hava看一下this。
答案 5 :(得分:2)
我首先检查相关证书是否已过期。与供应商合作时多次遇到这种情况。他们可以在不告知我们的情况下更新他们的证书。
答案 6 :(得分:0)
您可以通过浏览器查看证书。
在Internet Explorer中
Right Click >> Properties >> Certificates
进入证书窗口后,您也可以查看整个证书树。
如果您的证书无效,您可能需要使用keytool
命令查看解决方案。
答案 7 :(得分:0)
我认为您必须在jre1.6 cacert
中添加密钥库。然后再次部署您的服务器。通过添加keystore
PORTECLE
程序的方式。它非常有用。
答案 8 :(得分:0)
这个&#39; certificate_unknown&#39;是一个非常误导性的错误消息。这是证书过期时抛出的相同错误消息,即使它在信任库中也是如此。我建议您在浪费时间之前检查证书的到期日期。
答案 9 :(得分:0)
当我收到此错误时,问题是服务器证书使用签名算法SHA1withRSA和Android 8.0客户端。基于SHA256withRSA切换到服务器证书修复了该问题。
答案 10 :(得分:0)
我通过将jdk 1.7更改为jdk 1.8修复了SSL握手异常。