使用带有SSL套接字的对象流时出错

时间:2014-04-24 14:41:31

标签: java sockets ssl objectinputstream objectoutputstream

我有一对客户端 - 服务器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中使用客户端和服务器之间的安全通信?

1 个答案:

答案 0 :(得分:3)

这不是使用对象流的问题,因为在通过连接传输任何数据之前发生SSLHandshakeException。异常消息表明问题是找到服务器和客户端达成一致的加密方法。服务器支持一组密码,客户端支持一组不同的密码,并且两个集合中都没有密码。这假设异常消息是准确的;有时似乎这个例外可能是其他SSL问题的副作用。

我建议下一步是在客户端和服务器SSL套接字工厂上调用并打印出getDefaultCipherSuites()和getSupportedCipherSuites()的结果。如果异常是准确的,默认密码套件之间应该没有重叠,但希望在支持的密码套件中会有一些重叠,然后您可以设置SSL套接字工厂以启用和使用。