- Введение в SSL в Java
- 2. Вступление
- 3. JSSE API
- 3.1. SSLSocketFactoryс
- 3.2. SSLSocketс
- 3.3. SSLServerSocketFactoryс
- 3.4. SSLServerSocketс
- 4. Пример SSL
- 5. Заключение
- Введение в SSL на Java
- 2. Введение
- 3. API JSSE
- 3.1. SSLSocketFactory
- 3.2. SSLSocket
- 3.3. SSLServerSocket Factory
- 3.4. SSLServerSocket
- 4. Пример SSL
- 5. Заключение
- Читайте ещё по теме:
Введение в SSL в Java
В этом руководстве мы познакомимся с 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 по умолчанию:
- извлечь сертификат с сервера:openssl s_client -connect server:443
- импортировать сертификат в хранилище доверенных сертификатов с помощью 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.
Введение в SSL на Java
В этом уроке мы представим 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 использует для проверки защищенных соединений.
Чтобы решить эту проблему, у нас есть несколько вариантов:
- добавьте открытый сертификат сервера в файл по умолчанию cacertstruststore , используемый Java. при инициировании SSL-соединения
- Установите javax.net. ssl . trustStore переменная среды, указывающая на файл truststore, чтобы приложение могло получить этот файл, содержащий открытый сертификат сервера, к которому мы подключаемся.
Шаги по установке нового сертификата в хранилище доверия Java по умолчанию следующие:
- извлечение сертификата с сервера: openssl s_client -connect server:443
- импортируйте сертификат в truststore с помощью keytool: keytool -import -alias alias.server.com -хранилище ключей $JAVA_HOME/jre/lib/security/cacerts
Как только мы это сделаем, мы сможем снова запустить пример и получить сообщение Защищенное соединение успешно выполнено|/.
5. Заключение
В этой статье мы представили SSL и API JSSE, который реализует SSL для Java. Используя SSL и JSSE, мы можем сделать ваши Java-приложения и связь между приложениями и внутри приложения более безопасными.
Как всегда, код, представленный в этой статье, доступен на Github .