Безопасна ли связь SSLSocket с помощью прилагаемого кода?

Я разработал чат-сервер и клиент с использованием Sockets, и все было хорошо, пока я не прочитал где-то в Интернете, что обычное Socket общение уязвимо для атак. Погуглив некоторое время, я наткнулся на эта страница, на которой показан пример реализации SSLServerSocket и SSLSocket (код ниже).

Я хотел бы знать, безопасна ли связь между моим сервером и клиентом, если я выполню шаги в приведенном ниже коде.


Код сервера

class EchoServer {
  public static void main(String[] args) throws IOException {
    SSLServerSocket sslServerSocket = null;
    try {
      SSLServerSocketFactory sslServerSocketFactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
      sslServerSocket = (SSLServerSocket) sslServerSocketFactory.createServerSocket(9999);
      SSLSocket sslSocket = (SSLSocket) sslServerSocket.accept();
      PrintWriter out = new PrintWriter(sslSocket.getOutputStream(),true);
      BufferedReader in = new BufferedReader(new InputStreamReader(sslSocket.getInputStream()));
      String inputLine;
      while ((inputLine = in.readLine()) != null) {
        System.out.println(inputLine);
        out.println(inputLine);
      }
    } finally {
      if (sslServerSocket != null) {
        try {
          sslServerSocket.close();
        } catch (IOException x) {
          // handle error
        }
      }
    }
  }
}


Код клиента

class EchoClient {
  public static void main(String[] args) throws IOException {
    SSLSocket sslSocket = null;
    try {
      SSLSocketFactory sslSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
      sslSocket = (SSLSocket) sslSocketFactory.createSocket("localhost", 9999);
      PrintWriter out = new PrintWriter(sslSocket.getOutputStream(), true);
      BufferedReader in = new BufferedReader(new InputStreamReader(sslSocket.getInputStream()));
      BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
      String userInput;
      while ((userInput = stdIn.readLine()) != null) {
        out.println(userInput);
        System.out.println(in.readLine());
      }
    } finally {
      if (sslSocket != null) {
        try {
          sslSocket.close();
        } catch (IOException x) {
          // handle error
        }
      }
    }
  }
}

person AbidingCitizen    schedule 12.07.2014    source источник
comment
Этот вопрос кажется не по теме, потому что он касается проверки кода.   -  person aliteralmind    schedule 12.07.2014
comment
@AbidingCitizen. Вслед за aliteralmind вы можете попробовать здесь: Code Review Stack Exchange.   -  person jww    schedule 12.07.2014
comment
Я не согласен. ОП спрашивает о свойствах существующего кода, а не о том, можно ли его лучше закодировать.   -  person user207421    schedule 12.07.2014


Ответы (1)


Вы должны получить одноранговый сертификат через HandshakeCompletionListener или SSLSession, чтобы убедиться, что вы разговариваете с хостом, с которым, по вашему мнению, разговариваете. В остальном ваш код в порядке с точки зрения безопасности.

Однако вы также должны знать, что вам не следует использовать PrintWriter по сети, так как он проглатывает исключения.

person user207421    schedule 12.07.2014
comment
Еще раз спасибо, что пришли мне на помощь. - person AbidingCitizen; 12.07.2014
comment
Другой способ проверить имя хоста (недоступный до Java 7) — использовать setEndpointIdentificationAlgorithm(HTTPS). - person Bruno; 12.07.2014
comment
@Бруно Спасибо, приму к сведению - person AbidingCitizen; 13.07.2014