java - 执行 SSL TLS 客户端服务器 Java 程序时出现问题

标签 java sockets jakarta-ee networking ssl

我刚刚开始学习 Java 中的 SSL TLS 并编写了简单的客户端和服务器程序。我首先运行服务器程序,然后是客户端程序。在执行时,客户端程序给出以下异常堆栈跟踪:-

Exception in thread "main" javax.net.ssl.SSLHandshakeException: no cipher suites in common
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
at sun.security.ssl.ServerHandshaker.chooseCipherSuite(Unknown Source)
at sun.security.ssl.ServerHandshaker.clientHello(Unknown Source)
at sun.security.ssl.ServerHandshaker.processMessage(Unknown Source)
at sun.security.ssl.Handshaker.processLoop(Unknown Source)
at sun.security.ssl.Handshaker.process_record(Unknown Source)
at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.readDataRecord(Unknown Source)
at sun.security.ssl.AppInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at SSLServer.main(SSLServer.java:19)

请告诉我这个问题的解决方案。服务器和客户端程序如下:-

import java.io.BufferedReader;
import java.io.InputStreamReader;

import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;

public class SSLServer {

  private static final int PORT = 8080;

  public static void main(String[] args) throws Exception {

    SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
    SSLServerSocket ss = (SSLServerSocket)ssf.createServerSocket(PORT);
    SSLSocket s = (SSLSocket)ss.accept();
    BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
    String line = null;
    while (((line = in.readLine()) != null)) {
      System.out.println(line);
    }
    in.close();
    s.close();
  }
}



import java.io.OutputStream;

import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;

public class SSLClient {

  private static final String HOST = "localhost";

  private static final int PORT = 8080;

  public static void main(String[] args) throws Exception {
    SSLSocketFactory sf = (SSLSocketFactory) SSLSocketFactory.getDefault();
    SSLSocket s = (SSLSocket)sf.createSocket(HOST, PORT);
    OutputStream out = s.getOutputStream();
    out.write("\nConnection established.\n\n".getBytes());
    out.flush();
    int theCharacter = 0;
    theCharacter = 5;
    while (theCharacter != '~') // The '~' is an escape character to exit
    {
      out.write(theCharacter);
      out.flush();
      theCharacter = '~';
    }

    out.close();
    s.close();
  }
}

最佳答案

让客户端和服务器商定一个共同的密码。 将以下代码添加到服务器和客户端。

String[] enableCipherSuite = {"SSL_DH_anon_WITH_RC4_128_MD5"}; s.setEnabledCipherSuites(enableCipherSuite);

关于java - 执行 SSL TLS 客户端服务器 Java 程序时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23963122/

相关文章:

java - 终止参与者层次结构

java - 在java中,同一个程序可以同时作为服务器和客户端运行吗?

java - SQLite - 数据库在 Java 中被锁定

java - 如何在没有 if 构造的情况下引发异常

linux - 连接Redis时无法读取任何数据

java - 为什么 JTA 不支持嵌套事务

java - 推荐的源代码管理目录结构?

java - eclipse/java中的嵌套项目是什么

java - 在 Intent 之间发送自定义模型列表

sockets - 建立的连接被主机中的软件中止了