java - 将对象流与 SSL 套接字一起使用时出错

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

最佳答案

这不是使用对象流的问题,因为在通过连接传输任何数据之前会发生 SSLHandshakeException。异常消息表明问题在于寻找服务器和客户端同意的加密方法。服务端支持一套密码,客户端支持一套不同的密码,没有两种密码都在。这是假设异常消息是准确的;有时,此异常似乎是其他 SSL 问题的副作用。

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

关于java - 将对象流与 SSL 套接字一起使用时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23272174/

相关文章:

java - 如何从 keyevent 方法调用文本字段变量?

java - 将 Python 网络代码转换为 Java

php - ZeroMQ PUB/SUB 不适用于 PHP

linux - 适用于 Linux 的 Azure 应用服务是否支持 http2?

java - 如何使用与 PHP mail() 相同的机制在 Java 中发送邮件

java - 关于如何使用 A* 解决 Java 中的尖峰时刻谜题并获得最低移动次数的指南。需要有关如何开始和遵循的步骤的帮助

java - 在 Java 中将日期格式 dd-MM-yyyy 更改为 yyyy-MM-dd

C 和 Linux : Reusing a closed socket/Alternatives

apache - 无法获取证书crl

ubuntu - 使用新用户运行时,Wget 无法写入文件。如何解决?