【问题标题】:SSL Socket Connection working even though client is not sending certificate?即使客户端没有发送证书,SSL 套接字连接也能正常工作?
【发布时间】:2015-01-01 22:13:54
【问题描述】:

我对使用 Java 的密码学非常陌生。在进行任何数据通信之前,我必须构建一个交换证书的程序。我正在使用 sslSockets 构建基本的客户端-服务器程序,而我没有使用 HTTP/S,这只是为了获得额外的安全性。 (想知道 Socket 和 SSLSocket 的区别。是不是所有东西都是自动加密的?)

这是我更新后的服务器代码:

public class SSLServerExample {
    final static String pathToStores = "C:/Users/XXX/Desktop/sslserverclientprogram";
    final static String keyStoreFile = "keystore.jks";
    final static String passwd = "changeit";

    final static int theServerPort = 8443;

    static boolean debug = false;



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

      String trustFilename = pathToStores + "/" + keyStoreFile;
//    System.out.println("Verifying KeyStore File of Client..");

    System.setProperty("javax.net.ssl.keyStore", trustFilename);
    System.setProperty("javax.net.ssl.keyStorePassword", passwd);
    if (debug)
        System.setProperty("javax.net.debug", "all");
        System.out.println("Setting up SSL parameters");

     // Initialize socket connection
       SSLServerSocketFactory sslssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
    SSLServerSocket sslServerSocket = (SSLServerSocket)sslssf.createServerSocket(theServerPort);
    System.out.println("Server Started..Waiting for clients");
    sslServerSocket.setNeedClientAuth(true);
    SSLSocket sslSocket = (SSLSocket)sslServerSocket.accept();
    //sslSocket.startHandshake();
    System.out.println("Client Connected!");

    InputStream sslIS = sslSocket.getInputStream();

        OutputStream sslOS = sslSocket.getOutputStream();
        sslServerSocket.setNeedClientAuth(true);

    final int RSAKeySize = 1024;
    final String newline = "\n";

    Key pubKey = null;
    Key privKey = null; 
    boolean flag = sslSocket.getNeedClientAuth();
    System.out.println("Flag value: "+ flag);

该标志导致 False,即使我将其设置为 true 并且客户端发送的数据由服务器解密而无需相互验证。

我错过了什么吗?

请帮忙。

PS:我的客户代码:

public class SSLClientExample {
    final static String pathToStores = "C:/Users/XXX/Desktop/sslserverclientprogram";
    final static String trustStoreFile = "cacerts.jks";
    final static String passwd = "changeit";
    final static String INPUT_FILE = "E:/workspace/input.txt";
    final static String theServerName = "localhost";
    final static int theServerPort = 8443;

    static boolean debug = false;

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

      String trustFilename = pathToStores + "/" + trustStoreFile;
      System.out.println("Validating KeyStore file of Server..");

    System.setProperty("javax.net.ssl.trustStore", trustFilename);
    System.setProperty("javax.net.ssl.trustStorePassword", passwd);
    if (debug)
        System.setProperty("javax.net.debug", "all");


    SSLSocketFactory sslssf = (SSLSocketFactory) SSLSocketFactory.getDefault();
    SSLSocket sslSocket = (SSLSocket)sslssf.createSocket(theServerName, 8443);
    System.out.println("Connected to Server!");

【问题讨论】:

    标签: java sockets ssl ssl-certificate


    【解决方案1】:

    在接受传入的客户端连接之前,您必须调用 sslServerSocket.setNeedClientAuth(true);。建立连接后,您正在修改服务器套接字的配置。

    【讨论】:

    • 我这样做了,现在我的程序抛出错误!如何交换证书?哪个命令可以帮助我做到这一点.. 对不起愚蠢的问题? :( .. 在更新的问题中查看修改后的程序!
    • @Papps 现在您需要向客户端提供一个 KeyStore,就像您在服务器中一样,包含它自己的私钥和证书。
    猜你喜欢
    • 2012-03-27
    • 2013-04-15
    • 1970-01-01
    • 2013-10-08
    • 2012-08-25
    • 2021-12-22
    • 2012-11-10
    • 1970-01-01
    • 2021-04-22
    相关资源
    最近更新 更多