Введение в 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 .