2017-01-19 7 views
0

Мне нужно разработать настольное приложение клиент-сервер с SSL-сокетами в Java. Одним из требований является шифрование сообщений.Как проверить соединение с SSL-сокетами в java (client-server) с помощью wirehark и другими сомнениями

Я пытаюсь использовать некоторые примеры кода в Интернете, чтобы знать, как сделать зашифрованное соединение. Примеры, похоже, работают нормально или, по крайней мере, они не генерируют ошибок, однако я должен проверить из Wireshark, что сообщения фактически зашифрованы, но в wirehark я вижу только TCP-пакеты. На мой взгляд, у меня есть сертификаты и хранилища ключей.

JavaSSLServer.java

/** 
@web http://java-buddy.blogspot.com/ 
*/  
public class JavaSSLServer { 

static final int port = 8000; 

public static void main(String[] args) { 

    System.setProperty("javax.net.ssl.keyStore","/home/jose/serverKey.jks"); 
    System.setProperty("javax.net.ssl.keyStorePassword","servpass"); 
    SSLServerSocketFactory sslServerSocketFactory = 
      (SSLServerSocketFactory)SSLServerSocketFactory.getDefault(); 

    try { 
     ServerSocket sslServerSocket = 
       sslServerSocketFactory.createServerSocket(port); 
     System.out.println("SSL ServerSocket started"); 
     System.out.println(sslServerSocket.toString()); 

     Socket socket = sslServerSocket.accept(); 
     System.out.println("ServerSocket accepted"); 

     PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
     try (BufferedReader bufferedReader = 
       new BufferedReader(
         new InputStreamReader(socket.getInputStream()))) { 
      String line; 
      while((line = bufferedReader.readLine()) != null){ 
       System.out.println(line); 
       out.println(line); 
      } 
     } 
     System.out.println("Closed"); 

    } catch (IOException ex) { 
     Logger.getLogger(JavaSSLServer.class.getName()) 
       .log(Level.SEVERE, null, ex); 
    } 
}} 

JavaSSLClient.java

/** 
@web http://java-buddy.blogspot.com/ 
*/  
public class JavaSSLClient { 

static final int port = 8000; 

public static void main(String[] args) { 
    System.setProperty("javax.net.ssl.trustStore", "/home/jose/clientTrustedCerts.jks"); 
    System.setProperty("javax.net.ssl.trustStorePassword", "clientpass"); 
    SSLSocketFactory sslSocketFactory = 
      (SSLSocketFactory)SSLSocketFactory.getDefault(); 
    try { 
     Socket socket = sslSocketFactory.createSocket("localhost", port); 
     PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
     try (BufferedReader bufferedReader = 
       new BufferedReader(
         new InputStreamReader(socket.getInputStream()))) { 
      Scanner scanner = new Scanner(System.in); 
      while(true){ 
       System.out.println("Enter something:"); 
       String inputLine = scanner.nextLine(); 
       if(inputLine.equals("q")){ 
        break; 
       } 

       out.println(inputLine); 
       System.out.println(bufferedReader.readLine()); 
      } 
     } 

    } catch (IOException ex) { 
     Logger.getLogger(JavaSSLClient.class.getName()) 
       .log(Level.SEVERE, null, ex); 
    } 

} 

} 

Я добавил System.setProperty (...

В Wireshark:

image

Другой пример:

https://github.com/chuidiang/chuidiang-ejemplos-google-code/commit/2843dafc0a942c2dd636f7e2e1f9be6fe0b9e9ec

Результаты в Wireshark были похожи.

Я хочу установить соединение с SSL-сокетами, которые шифруют сообщения между клиентом и сервером и могут быть проверены с Wireshark (это еще одно требование).

Мои вопросы:

  • Как проверить, что сообщение фактически шифруется с помощью Wireshark?

  • Должен ли я видеть пакеты SSL/TLS вместо TCP, чтобы заключить, что они зашифрованы?

  • Можете ли вы сказать мне, если какой-либо примерный код неправильный или неполный?

+0

Отправить знакомое сообщение и посмотреть, сможете ли вы его просмотреть в Wireshark. Это фактическое требование. – EJP

ответ

1

Ваш клиент и сервер обмениваются коды простых текстовых сообщений, так что если вы не видите, что обычный текст в TCP-пакетах, то сообщения, вероятно, шифруются (что они должны быть, учитывая код, показанный).

Чтобы проверить, вы можете отфильтровать захват Wireshark по двум парам IP/порта соединения, а затем декодировать этот поток TCP как TLS и посмотреть, удастся ли это. Если это так, он отобразит первые несколько пакетов соединения (после трехстороннего установления связи TCP) - это незашифрованное рукопожатие TLS (обмен сертификатами и согласование значений шифрования), а последующие пакеты - зашифрованные TLS-пакеты.