Рубрики
Без рубрики

Введение в SSL на Java

Краткое и практическое введение в SSL на Java.

Автор оригинала: baeldung.

1. Обзор

В этом уроке мы представим SSL и рассмотрим, как мы можем использовать его в Java с помощью API JSSE (Java Secure Socket Extension).

2. Введение

Проще говоря, уровень защищенных сокетов (SSL) обеспечивает защищенное соединение между двумя сторонами , обычно клиентами и серверами.

SSL обеспечивает безопасный канал между двумя устройствами, работающими по сетевому соединению. Одним из обычных примеров SSL является обеспечение безопасной связи между веб-браузерами и веб-серверами.

В этом конкретном случае веб-браузеры будут использовать HTTPS (S, обозначающие защищенные соединения) для доступа к ресурсам, предоставляемым различными веб-серверами.

SSL необходим для поддержки трех основных принципов информационной безопасности:

  • Шифрование : защита передачи данных между сторонами
  • Аутентификация : убедитесь, что сервер, к которому мы подключаемся, действительно является правильным сервером
  • Целостность данных : гарантия того, что запрашиваемые данные будут эффективно доставлены

Java предоставляет несколько API-интерфейсов на основе безопасности, которые помогают разработчикам устанавливать безопасные соединения с клиентом для получения и отправки сообщений в зашифрованном формате:

  • Расширение защищенного сокета Java (JSSE)
  • Архитектура криптографии Java (JCA)
  • Расширение криптографии Java (JCE)

В следующих разделах мы представим расширение Secure Socket, которое Java использует для обеспечения безопасной связи.

3. API JSSE

API безопасности Java широко используют шаблон Factory design.

На самом деле все создается с помощью фабрики в JSSE.

3.1. SSLSocketFactory

javax.net.ssl.SSLSocketFactory используется для создания объектов SSLSocket .

Этот класс содержит три группы API.

Первая группа состоит из одного статического метода getDefault () , используемого для извлечения экземпляра по умолчанию, который, в свою очередь, может создавать экземпляры SSLSocket .

Вторая группа состоит из пяти методов, которые можно использовать для создания экземпляров SSLSocket :

  • Сокет createSocket(String host, int-порт)
  • Сокет createSocket(String host, int port, InetAddress clientHost, int clientPort)
  • Сокет createSocket(хост InetAddress, порт int)
  • Сокет createSocket(InetAddress host, int port, InetAddress clientHost, int clientPort)
  • Socket createSocket(сокет, строковый хост, порт int, логическая автоклюзия)

Мы можем использовать этот класс напрямую, получив экземпляр по умолчанию или используя объект javax.net.ssl. SSLContext, который содержит методы для получения экземпляра SSLSocketFactory .

3.2. SSLSocket

Этот класс расширяет класс Socket и обеспечивает безопасный сокет. Такие сокеты являются обычными потоковыми сокетами.

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

Экземпляры SSLSocket создают SSL-соединение с именованным хостом на указанном порту.

Это позволяет привязать клиентскую сторону соединения к заданному адресу и порту.

3.3. SSLServerSocket Factory

Класс SSLServerSocketFactory очень похож на SSLSocketFactory с той разницей, что он создает экземпляры SSLServerSocket вместо экземпляров SSLSocket .

По сходству методы называются createServerSocket аналогично классу SSLSocketFactory .

3.4. SSLServerSocket

Класс SSLServerSocket аналогичен классу SSLSocket . Методы класса SSLServerSocket являются подмножеством методов класса SSLSocket . Они действуют на противоположной стороне SSL-соединения

4. Пример SSL

Давайте приведем пример того, как мы можем создать защищенное соединение с сервером:

String host = getHost(...);
Integer port = getPort(...);
SSLSocketFactory sslsocketfactory = SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory
  .createSocket(host, port);
InputStream in = sslsocket.getInputStream();
OutputStream out = sslsocket.getOutputStream();

out.write(1);
while (in.available() > 0) {
    System.out.print(in.read());
}

System.out.println("Secured connection performed successfully");

В случае, если мы получим ошибку “javax.net.ssl.SSLHandshakeException: sun.security.validator.Исключение ValidatorException: ошибка построения пути PKIX: sun.security.provider.certpath.Исключение SunCertPathBuilderException: не удается найти допустимый путь сертификации к запрошенному целевому объекту при установлении SSL-соединения” , это указывает на то, что у нас нет открытого сертификата сервера, который мы пытаемся подключить в хранилище доверия Java.

Хранилище доверия-это файл, содержащий доверенные сертификаты, которые Java использует для проверки защищенных соединений.

Чтобы решить эту проблему, у нас есть несколько вариантов:

  • добавьте открытый сертификат сервера в файл по умолчанию cacerts truststore , используемый Java. при инициировании SSL-соединения
  • Установите javax.net. ssl . trustStore переменная среды, указывающая на файл truststore, чтобы приложение могло получить этот файл, содержащий открытый сертификат сервера, к которому мы подключаемся.

Шаги по установке нового сертификата в хранилище доверия Java по умолчанию следующие:

  1. извлечение сертификата с сервера: openssl s_client -connect server:443
  2. импортируйте сертификат в truststore с помощью keytool: keytool -import -alias alias.server.com -хранилище ключей $JAVA_HOME/jre/lib/security/cacerts

Как только мы это сделаем, мы сможем снова запустить пример и получить сообщение Защищенное соединение успешно выполнено|/.

5. Заключение

В этой статье мы представили SSL и API JSSE, который реализует SSL для Java. Используя SSL и JSSE, мы можем сделать ваши Java-приложения и связь между приложениями и внутри приложения более безопасными.

Как всегда, код, представленный в этой статье, доступен на Github .