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 или взаимном протоколе TLS (mTLS) клиент и сервер аутентифицируют друг друга, чтобы гарантировать, что обе стороны, участвующие в обмене данными, являются доверенными. Для реализации MTLS обе стороны делятся друг с другом своими публичными сертификатами.
3. Настройка TLS в Spring Boot
3.1. Создание пары ключей
Чтобы включить TLS, нам нужно создать пару открытых/закрытых ключей . Для этого мы используем keytool . Команда keytool поставляется с дистрибутивом Java по умолчанию. Давайте используем keytool для создания пары ключей и сохранения ее в файле keystore.p12 :
keytool -genkeypair -alias baeldung -keyalg RSA -keysize 4096 \ -validity 3650 -dname "CN=localhost" -keypass changeit -keystore keystore.p12 \ -storeType PKCS12 -storepass changeit
Файл keystore может быть в разных форматах . Два самых популярных формата-хранилище ключей Java (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 весной
Для включения tls мы используем атрибут client-auth со значением need :
server.ssl.client-auth=need
Когда мы используем значение need , аутентификация клиента необходима и обязательна. Это означает, что и клиент, и сервер должны совместно использовать свой открытый сертификат. Для хранения сертификата клиента в приложении Spring Boot мы используем файл truststore и настраиваем его в файле application.properties :
#trust store location server.ssl.trust-store=classpath:keystore/truststore.p12 #trust store password server.ssl.trust-store-password=changeit
Путь к местоположению truststore – это файл, содержащий список центров сертификации, которым доверяет машина для проверки подлинности SSL-сервера. Пароль truststore – это пароль для получения доступа к файлу truststore .
4. Настройка TLS в Tomcat
По умолчанию при запуске Tomcat используется протокол HTTP без каких-либо возможностей TLS. Для включения TLS в Tomcat мы настраиваем server.xml файл:
Для включения MTLS мы установим clientAuth=”true” .
5. Вызов HTTPS API
Для вызова REST API мы будем использовать инструмент curl:
curl -v http://localhost:8443/baeldung
Поскольку мы не указали https , он выдаст ошибку:
Bad Request This combination of host and port requires TLS.
Эта проблема решается с помощью протокола https :
curl -v https://localhost:8443/baeldung
Однако это дает нам еще одну ошибку:
SSL certificate problem: self signed certificate
Это происходит, когда мы используем самозаверяющий сертификат. Чтобы исправить это, мы должны использовать сертификат сервера в запросе клиента. Сначала мы скопируем сертификат сервера baeldung.cer с сервера хранилища ключей файла. Затем мы будем использовать сертификат сервера в запросе curl вместе с опцией –cacert :
curl --cacert baeldung.cer https://localhost:8443/baeldung
6. Заключение
Для обеспечения безопасности данных, передаваемых между клиентом и сервером, протокол TLS может быть реализован как односторонний, так и двусторонний. В этой статье мы опишем, как настроить TLS в приложении Spring Boot в файле application.properties и в файле конфигурации Tomcat. Как обычно, все примеры кода, используемые в этом руководстве, доступны на GitHub.