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:
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.