我有一对客户端 - 服务器java程序,它们使用安全通信进行对象传输(使用对象输入和输出流)。该程序是一个多客户端程序,每个客户端使用一个单独的线程。以下是代码片段:
final static private ServerSocketFactory serverFactory
= SSLServerSocketFactory.getDefault();
final static private SocketFactory clientFactory = SSLSocketFactory.getDefault();
serverSocket
= serverFactory.createServerSocket
(port, 0, InetAddress.getByName("192.168.1.2"));
while(running) {
clientSocket = serverSocket.accept();
System.out.println("Client connected :: " + clientSocket);
System.out.println("Creating client thread...");
Client c = new Client(count++, clientSocket);
c.T.start();
}
将处理客户请求的线程:
Client(int id, Socket cs){
T = new Thread(this, "Client Thread" + id);
this.socket = cs;
this.id = null;
try{
input = new ObjectInputStream(cs.getInputStream());
output = new ObjectOutputStream(cs.getOutputStream());
successful = true;
}catch(IOException ex){
successful = false;
}
}
客户端程序的代码非常相似。当我运行这两个程序并将请求从客户端发送到服务器时,服务器将接受请求,但是当执行到达从套接字检索到对象流的行时,我收到一个错误: javax.net.ssl.SSLHandshakeException:没有共同的密码套件
任何人都可以帮我吗?是否有更好的方法在Java GUI中使用客户端和服务器之间的安全通信?
答案 0 :(得分:3)
这不是使用对象流的问题,因为在通过连接传输任何数据之前发生SSLHandshakeException。异常消息表明问题是找到服务器和客户端达成一致的加密方法。服务器支持一组密码,客户端支持一组不同的密码,并且两个集合中都没有密码。这假设异常消息是准确的;有时似乎这个例外可能是其他SSL问题的副作用。
我建议下一步是在客户端和服务器SSL套接字工厂上调用并打印出getDefaultCipherSuites()和getSupportedCipherSuites()的结果。如果异常是准确的,默认密码套件之间应该没有重叠,但希望在支持的密码套件中会有一些重叠,然后您可以设置SSL套接字工厂以启用和使用。