gpt4 book ai didi

java - 无法连接到 ssl 服务器收到致命警报 : certificate_unknown and ReadDataRecord(SSLSocketImpl

转载 作者:太空宇宙 更新时间:2023-11-03 13:53:40 24 4
gpt4 key购买 nike

我有一种情况,客户端 A 应该连接到服务器 B,服务器 B 应该连接到服务器 C。并且连接必须是安全套接字。

我尝试并成功地分别建立了 A 到 B 和 B 到 C 的连接。但是当我尝试同时建立到 A 到 B 和 B 到 C 的连接时,它会引发错误

javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2011)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1113)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1363)
at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:916)
at sun.security.ssl.AppInputStream.read(AppInputStream.java:105)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at VfSer.main(VfSer.java:51)

这是我尝试过的代码,我为 A 到 B 和 B 到 C 连接使用了两个不同的证书。

这是A代码

            System.setProperty("javax.net.ssl.trustStore", "vaserkey");
System.setProperty("javax.net.ssl.trustStoreSSN", "123456");
try {
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(args[0], Integer.parseInt(args[1]));
//.....
}

这是B代码

            System.setProperty("javax.net.ssl.keyStore", "vaserkey");
System.setProperty("javax.net.ssl.keyStorePassword", "123456");
//adding ssl layer to socket connection
SSLServerSocketFactory sslserversocketfactory =(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket sslserversocket =(SSLServerSocket) sslserversocketfactory.createServerSocket(Integer.parseInt(args[0]));
//taking infinite connection one by one
while(true){
//accepting incoming connection
SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();//....
}catch(Exception e){}
//after receiving data trying to establish connection with C
System.setProperty("javax.net.ssl.trustStore", "vfserkey");
System.setProperty("javax.net.ssl.trustStoreSSN", "123456");
SSLSocketFactory sslsocketfactory1 = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket1 = (SSLSocket) sslsocketfactory1.createSocket(ip, port);

//..向C发送数据这是 C 代码:

        System.setProperty("javax.net.ssl.keyStore", "vfserkey");
System.setProperty("javax.net.ssl.keyStorePassword", "123456");
try {
//adding ssl layer to socket connection
SSLServerSocketFactory sslserversocketfactory =(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket sslserversocket =(SSLServerSocket) sslserversocketfactory.createServerSocket(Integer.parseInt(args[0]));

SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();

//获取连接并接收来自C的数据}最后是我用来生成证书的工具。

keytool -genkey vaserkey -keyalg RSA
keytool -genkey vfserkey -keyalg RSA

抱歉,如果我说错了什么,我是 SSL 编程的新手,如果我错了,请纠正我..

最佳答案

首先设置所有 SSL 属性。 DefaultSSLContext 默认情况下由 SSLSocketFactorySSLServerSocketFactory 使用,但它仅在第一次使用时构建。更改任何相关系统属性或它们指向的文件,第一次使用后将被忽略并且没有任何效果。因此,您需要在调用任一 工厂之前设置所有 javax.net.ssl.* 属性。

还有:

无法正确复制这些 keytool 命令。您需要在每个文件名之前使用 -keystore。他们生成私钥(自签名)证书;你不能只生成一个证书,如果可以的话,它几乎不能用于包括 SSL/TLS 在内的任何东西。最后,现在首选的操作是-genkeypair;拼写 -genkey 支持向后兼容,但最终可能会被删除。

将 keystore (条目)用作信任库是不明智的。虽然 TrustManager 逻辑确实在私钥条目中找到并使用证书(见上文),但复制 keystore (或只是私钥条目/ies) 到 relier(s)/client(s) 是不好的做法。 [edit] 任何获得您私钥的人通常都可以冒充您,其结果包括窃取您的敏感数据和其他资源,例如金钱。即使特定的客户端不是恶意的,他们也很少有动力像您一样小心您的 key ,如果有很多客户端,他们可能有多台机器、备份、替换、虚拟化、外包、测试、临时工、承包商等,这种风险成倍增加。

正确/更好的方法是从服务器 keystore 导出证书,将证书导入客户端信任库(以“Java KeyStore”格式,但实际上不是 key )类似于:

 keytool -keystore vaserkey -exportcert -file vasercert
keytool -keystore vasertrust -importcert -file vasercert
# same again for vf...
# use vasertrust for A-trust and vfserTrust for B-trust in your example

关于java - 无法连接到 ssl 服务器收到致命警报 : certificate_unknown and ReadDataRecord(SSLSocketImpl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30005257/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com