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

Java Top

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА

1. Общ преглед

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

2. Въведение

Казано по-просто, Secure Socket Layer (SSL) позволява защитена връзка между две страни , обикновено клиенти и сървъри.

SSL осигурява защитен канал между две устройства, работещи през мрежова връзка. Един обикновен пример за SSL е да се даде възможност за сигурна комуникация между уеб браузъри и уеб сървъри.

В този конкретен случай уеб браузърите ще използват HTTPS (S означава Защитени) връзки за достъп до ресурсите, предоставени от отделни уеб сървъри.

SSL е необходим за поддържане на трите основни принципа на информационна сигурност:

  • Шифроване : защита на предаването на данни между страните
  • Удостоверяване : уверете се, че сървърът, към който се свързваме, наистина е правилният сървър
  • Целостта на данните : гарантирайте, че исканите данни са това, което е ефективно доставено

Java предоставя няколко API-та, базирани на сигурността, които помагат на разработчиците да установят сигурни връзки с клиента за получаване и изпращане на съобщения в криптиран формат:

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

В следващите раздели ще представим разширението Secure Socket, което Java използва за активиране на защитена комуникация.

3. JSSE API

Приложните програмни интерфейси (API) на Java широко използват модела за фабричен дизайн.

Всъщност всичко се създава с помощта на фабрика в JSSE.

3.1. SSLSocketFactory

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

Този клас съдържа три групи API.

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

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

  • Socket createSocket (String хост, int порт)
  • Socket createSocket (хост на низ, int порт, InetAddress clientHost, int clientPort)
  • Socket createSocket (InetAddress хост, int порт)
  • Socket createSocket (InetAddress хост, int порт, InetAddress clientHost, int clientPort)
  • Socket createSocket (Socket socket, String host, int port, boolean autoClose)

Можем да използваме този клас директно, като получим екземпляра по подразбиране или като използваме 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 изграждане на път не успя: sun.security.provider.certpath.SunCertPathBuilderException: не може да се намери валиден път за сертифициране до заявената цел, докато се установява целта SSL връзка ” , означава, че нямаме публичния сертификат на сървъра, който се опитваме да свържем в Java truststore.

Trustostore е файлът, съдържащ надеждни сертификати, които Java използва за проверка на защитени връзки.

За да разрешим този проблем, имаме няколко възможности:

  • добавете публичния сертификат на сървъра към магазина за доверие по подразбиране, използван от Java. докато инициира SSL връзка
  • Задайте javax.net. ssl . Променливата на среда trustStore, за да сочи към файла truststore, за да може приложението да вземе този файл, който съдържа публичния сертификат на сървъра, към който се свързваме.

Стъпките за инсталиране на нов сертификат в хранилището на Java по подразбиране са:

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

След като направим това, трябва да можем да стартираме примера отново и да получим съобщението Защитена връзка, извършена успешно .

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

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

Както винаги, кодът, представен в тази статия, е достъпен в Github.

Дъно на Java

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА