【发布时间】:2015-07-12 08:53:39
【问题描述】:
我有一种情况,客户端 A 应该连接到服务器 B,服务器 B 应该连接到服务器 C。并且连接必须是安全套接字。
我尝试并成功建立了 b/w 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 编程的新手,如果我错了,请纠正我..
【问题讨论】:
-
“0 票最喜欢”?
-
对不起先生。我没有得到你。我做错了什么吗?
-
你为什么在你的帖子开头加上“0 反对票”?
-
对不起先生。这是我的错误。我没有注意到。
-
这意味着他们从另一个帖子中复制并粘贴它,可能是一个已关闭和/或删除的帖子。 @CupawnTae
标签: java sockets ssl ssl-certificate keytool