Перейти к основному содержимому

Настройка TLS весной

· 4 мин. чтения

1. Обзор

Безопасная связь играет важную роль в современных приложениях. Связь между клиентом и сервером по простому HTTP не является безопасной. Для готового к производству приложения мы должны включить HTTPS через протокол TLS (Transport Layer Security) в нашем приложении. В этом руководстве мы обсудим, как включить технологию TLS в приложении Spring Boot.

2. Протокол TLS

TLS обеспечивает защиту данных при передаче между клиентом и сервером и является ключевым компонентом протокола HTTPS. Secure Sockets Layer (SSL) и TLS часто используются взаимозаменяемо, но это не одно и то же . По сути, TLS является преемником SSL. TLS может быть реализован как односторонним, так и двусторонним.

2.1. Односторонний TLS

В одностороннем TLS только клиент проверяет сервер, чтобы убедиться, что он получает данные с доверенного сервера. Для реализации одностороннего TLS сервер делится своим общедоступным сертификатом с клиентами.

2.2. Двусторонний TLS

В двустороннем TLS или Mutual TLS (mTLS) и клиент, и сервер аутентифицируют друг друга, чтобы гарантировать доверие обеих сторон, участвующих в обмене данными. Для реализации mTLS обе стороны делятся своими публичными сертификатами друг с другом.

3. Настройка TLS в Spring Boot

3.1. Создание пары ключей

Чтобы включить TLS, нам нужно создать пару открытый/закрытый ключ . Для этого мы используем keytool . Команда keytool поставляется с дистрибутивом Java по умолчанию. Давайте используем keytool для создания пары ключей и сохранения ее в файле keystore.p12 :

keytool -genkeypair -alias foreach -keyalg RSA -keysize 4096 \
-validity 3650 -dname "CN=localhost" -keypass changeit -keystore keystore.p12 \
-storeType PKCS12 -storepass changeit

Файл хранилища ключей может быть в разных форматах . Двумя наиболее популярными форматами являются Java KeyStore (JKS) и PKCS#12. JKS специфичен для Java, а PKCS#12 — это стандартный отраслевой формат, принадлежащий к семейству стандартов, определенных в Стандартах криптографии с открытым ключом (PKCS).

3.2. Настройка TLS весной

Начнем с настройки одностороннего TLS. Мы настраиваем свойства, связанные с TLS, в файле application.properties :

# enable/disable https
server.ssl.enabled=true
# keystore format
server.ssl.key-store-type=PKCS12
# keystore location
server.ssl.key-store=classpath:keystore/keystore.p12
# keystore password
server.ssl.key-store-password=changeit

При настройке протокола SSL мы будем использовать TLS и укажем серверу использовать TLS 1.2:

# SSL protocol to use
server.ssl.protocol=TLS
# Enabled SSL protocols
server.ssl.enabled-protocols=TLSv1.2

Чтобы убедиться, что все работает нормально, нам просто нужно запустить приложение Spring Boot:

./75e196ddc5c254a924388d8ccd70049d.png

3.3. Настройка mTLS в Spring

Для включения mTLS мы используем атрибут client-auth со значением need :

server.ssl.client-auth=need

Когда мы используем значение need , аутентификация клиента необходима и обязательна. Это означает, что и клиент, и сервер должны использовать общий сертификат. Для хранения сертификата клиента в приложении Spring Boot мы используем файл хранилища доверенных сертификатов и настраиваем его в файле application.properties :

#trust store location
server.ssl.trust-store=classpath:keystore/truststore.p12
#trust store password
server.ssl.trust-store-password=changeit

Путь к хранилищу доверенных сертификатов — это файл, содержащий список центров сертификации, которым машина доверяет для аутентификации сервера SSL. Пароль хранилища доверенных сертификатов — это пароль для доступа к файлу хранилища доверенных сертификатов .

4. Настройка TLS в Tomcat

По умолчанию при запуске Tomcat используется протокол HTTP без каких-либо возможностей TLS. Для включения TLS в Tomcat мы настраиваем файл server.xml :

<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
port="8443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="${user.home}/.keystore" keystorePass="changeit"
clientAuth="false" sslProtocol="TLS" sslEnabledProtocols="TLSv1.2"/>

Для включения mTLS мы установим clientAuth=”true” .

5. Вызов HTTPS API

Для вызова REST API мы будем использовать инструмент curl :

curl -v http://localhost:8443/foreach

Так как мы не указали https , будет выведена ошибка:

Bad Request
This combination of host and port requires TLS.

Эта проблема решается с помощью протокола https :

curl -v https://localhost:8443/foreach

Однако это дает нам другую ошибку:

SSL certificate problem: self signed certificate

Это происходит, когда мы используем самозаверяющий сертификат. Чтобы это исправить, мы должны использовать сертификат сервера в клиентском запросе. Сначала мы скопируем сертификат сервера foreach.cer из файла хранилища ключей сервера . Затем мы будем использовать сертификат сервера в запросе curl вместе с параметром –cacert :

curl --cacert foreach.cer https://localhost:8443/foreach

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

Для обеспечения безопасности данных, передаваемых между клиентом и сервером, TLS может быть реализован как в одностороннем, так и в двустороннем порядке. В этой статье мы опишем, как настроить TLS в приложении Spring Boot в файле application.properties и в файле конфигурации Tomcat. Как обычно, все примеры кода, используемые в этом руководстве, доступны на GitHub.