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

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

1. обзор

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

2. Вступление

Проще говоря,Secured Socket Layer (SSL) enables a secured connection between two parties, обычно клиенты и серверы.

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

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

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

  • Encryption: защита передачи данных между сторонами

  • Authentication: убедитесь, что сервер, к которому мы подключаемся, действительно правильный сервер

  • Data integrity: гарантия того, что запрошенные данные действительно доставлены

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

  • Расширение защищенных сокетов Java (JSSE)

  • Архитектура криптографии Java (JCA)

  • Криптографическое расширение Java (JCE)

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

3. JSSE API

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

Фактически все создается с использованием фабрики в JSSE.

3.1. SSLSocketFactoryс

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

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

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

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

  • Socket createSocket (строковый хост, порт int)

  • Socket createSocket (String host, int port, InetAddress clientHost, int clientPort)

  • Socket createSocket (хост InetAddress, порт int)

  • Socket createSocket (хост InetAddress, порт int, InetAddress clientHost, int clientPort)

  • Socket createSocket (Socket socket, String host, int port, логическое автоматическое закрытие)

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

3.2. SSLSocketс

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

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

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

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

3.3. SSLServerSocketFactoryс

Класс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 path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target while establishing the SSL connection”,it indicates that we don’t have the public certificate of the server which we’re trying to connect in the Java truststore.

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

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

  • добавьте публичный сертификат сервера кcacerts truststore по умолчанию, используемому Java. при инициализации соединения SSL

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

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

  1. извлечь сертификат с сервера:openssl s_client -connect server:443

  2. импортировать сертификат в хранилище доверенных сертификатов с помощью keytool:keytool -import -alias alias.server.com -keystore $JAVA_HOME/jre/lib/security/cacerts

Как только мы это сделаем, мы сможем снова запустить пример и получить сообщениеSecured connection performed successfully.

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

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

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

Related