Spring Boot - включить SSL (HTTPS) с сертификатом CA

Может быть, я найду здесь помощь. Я хочу включить SSL в приложении Spring Boot. У меня такая конфигурация:

сервер: порт: 8999 ssl: enabled: true хранилище ключей: путь к классам: хранилище ключей keystore.jks пароль-хранилище ключей: пароль-ключ-пароль mypass: mypass

Проблема в моем хранилище ключей. Я импортировал файл * crt в хранилище ключей с псевдонимом tomcat:

keytool -importcert -file certificate.crt -keystore native.jks -alias tomcat

Однако я все еще не могу получить доступ к своему rest api. В firefox рвет с ошибкой:

SSL_ERROR_RX_RECORD_TOO_LONG

  • это не работает. Как я могу создать надлежащее хранилище ключей, чтобы оно работало? Я выдаю сертификат CA, а НЕ самоподписанный. У меня есть такие файлы, как:

certificate.crt, certificate.p12, certificate.pk, privkey.pem и три файла root_ca_1.ca-bundle, root_ca_2.ca-bundle, root_ca_3.ca-bundle

. Это все, что у меня есть. Я очень новичок в теме ssl, просто прочитал несколько руководств и попробовал несколько команд keytool, чтобы заставить его работать. Буду благодарен за помощь. Заранее спасибо.


person Adam De    schedule 13.07.2017    source источник
comment
возможно, это поможет https://drissamri.be/blog/java/enable-https-in-spring-boot/   -  person René Winkler    schedule 13.07.2017
comment
Спасибо за ответ. Однако это руководство не решает мою проблему, поскольку оно основано на самозаверяющем сертификате. Я отчаянно ищу подсказки, как правильно импортировать сертификат CA в свое хранилище ключей.   -  person Adam De    schedule 13.07.2017


Ответы (3)


Я только что потратил день на выяснение этой точной проблемы, поэтому я поделюсь своим процессом здесь.

Каждая из приведенных ниже ссылок содержит инструкции по созданию и использованию самозаверяющего сертификата. Это не совсем то, что я пытаюсь сделать, но каждый из них содержит некоторую полезную справочную информацию.

ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА:

Я уже приобрел настоящий сертификат SSL, выпущенный центром сертификации, для 'wildcard' домена * .jimtough.org. Я приобрел сертификат в http://www.namecheap.com/, но фактический центр сертификации (CA ) является Comodo.

В рамках процедуры покупки / активации в центре сертификации мне нужно было выполнить следующие инструкции:

Обратите внимание, что я решил следовать их инструкциям AWS, потому что я являюсь пользователем AWS и у меня есть сервер EC2, на котором уже установлены OpenSSL и Java. Существует множество других альтернатив для выполнения той же процедуры, поэтому поищите дальше, чтобы найти инструкции по созданию CSR, которые подходят именно вам.

В конце этого шага у меня есть следующие два файла:

  • csr.pem - используется как часть процесса запроса / активации сертификата SSL.
  • private.key - Это часть моего закрытого ключа SSL-сертификата, которая мне понадобится позже для установки сертификата на мои серверы. Держите это в секрете. Держите это в безопасности.

После того, как я завершил процедуру покупки и проверки моего сертификата SSL, центр сертификации отправил мне обратно файл .zip, содержащий файлы .p7b, .crt и .ca-bundle.

Одна из ссылок ниже объясняет разницу между этими типами файлов сертификатов:

  • .p7b - этот тип должен быть совместим с приложениями на основе Java (формат PKCS # 7)
  • .crt - Этот тип должен быть совместим со всем остальным - ссылка выше предполагает, что это формат PEM
  • .ca-bundle - Не уверен, когда это использовать - ссылка выше предполагает, что это формат PEM

ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА:

Затем мне нужно выяснить, как использовать файлы, перечисленные выше, для настройки моего приложения Spring Boot для HTTPS.

Я буду следовать соответствующим частям приведенных ниже руководств, чтобы получить то, что мне нужно:

ПРИМЕЧАНИЕ. В обоих руководствах я НЕ буду следовать их разделам по созданию самозаверяющих сертификатов, поскольку у меня уже есть настоящий сертификат, выданный настоящим центром сертификации.

Первым важным шагом в их инструкциях является создание нового хранилища ключей Java. Требования:

  • Должна быть установлена ​​Java, поэтому у меня есть доступ к утилите keytool.
  • У меня должна быть установлена ​​утилита openssl, чтобы я мог создать файл .p12, используя мои файлы .key и .p7b в качестве входных.

Для этого я буду использовать свой сервер AWS EC2 Linux. На моем сервере уже установлены утилиты Java / keytool и OpenSSL. Сначала мне нужно использовать утилиту OpenSSL для создания файла .p12, который (если я правильно понимаю) будет содержать как мой закрытый ключ, так и сертификат CA-выдачи. Во-вторых, мне нужно создать новое хранилище ключей Java, которое будет содержать импортированную копию файла .p12.

  • openssl pkcs12 -export -out jimtough-dot-org.p12 -name "jimtough-dot-org" -inkey private.key -in __jimtough_org.crt
    • IMPORTANT: You need to provide a password at the 'export password' prompt, otherwise the keytool import in the next step will fail
  • keytool -importkeystore -srckeystore jimtough-dot-org.p12 -srcstoretype PKCS12 -destkeystore jimtough-dot-org-keystore.jks -deststoretype JKS
    • You will need to provide the password you used in the 'openssl' command
    • Вам также потребуется указать новый пароль для создаваемого вами хранилища ключей.
  • (OPTIONAL) keytool -importkeystore -srckeystore jimtough-dot-org-keystore.jks -destkeystore jimtough-dot-org-keystore.pkcs12 -deststoretype pkcs12
    • I received a warning from 'keytool' about JKS being a proprietary format, and a suggestion that I convert my keystore to PKCS12 format, so I did so with this optional command

Наконец, мне нужно упаковать мое недавно созданное хранилище ключей Java с моим приложением Spring Boot и настроить приложение для его использования.

ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА:

Я сослался на два руководства по Baeldung выше и смог получить детали, необходимые для работы моей Spring Boot (с включенной Spring Security).

Я создал новую папку «хранилище ключей» в существующем «src / main / resources» и скопировал туда оба моих вновь созданных файла хранилища ключей (я сохранил оба формата).

Я добавил блок ниже в файл application.properties моего приложения Spring Boot.

#--------------------------------------------------------------------------------------------------
# SSL CONFIGURATION
# The format used for the keystore. It could be set to JKS in case it is a JKS file
#server.ssl.key-store-type=JKS
server.ssl.key-store-type=PKCS12
# The path to the keystore containing the certificate
#server.ssl.key-store=classpath:keystore/jimtough-dot-org-keystore.jks
server.ssl.key-store=classpath:keystore/jimtough-dot-org-keystore.pkcs12
server.ssl.key-store-password=mykeystorepassword
server.ssl.key-alias=jimtough-dot-org
server.ssl.enabled=true
server.port=8443
#--------------------------------------------------------------------------------------------------

Как и ожидалось, я получаю кучу предупреждений от своего браузера, когда пытаюсь подключиться к локально запущенному экземпляру приложения Spring Boot, используя https: // localhost: 8443 / в качестве URL-адреса. Это происходит потому, что браузер правильно определяет несоответствие между localhost и ожидаемым доменом jimtough.org, для работы на котором был создан мой SSL-сертификат. При развертывании приложения на сервере, имя хоста которого - «something.jimtough.org» (или просто ), предупреждений не должно быть. www.jimtough.org).

Вот и все! Удачного HTTPS!

person Jim Tough    schedule 20.12.2020
comment
Это было отлично и все, что мне было нужно, потому что у меня уже был купленный сертификат. Все остальное, что я нашел, касалось самозаверяющих сертификатов, что было нереально для производства. Просто хотел добавить, что это шаги, которые я в конечном итоге выполнил и пропустил начальные: 1) У меня уже был файл .pfx от моего ssl-провайдера, поэтому я загрузил закрытый ключ и файл .pfx 2) Я узнал, что файл. Файл pfx также является файлом .p12, и вы можете переименовать его, если хотите. Я этого не делал, просто использовал файл .pfx и создал свое хранилище ключей. 3) Затем я использовал хранилище ключей для создания файла pkcs12 - person logixplayer; 16.05.2021
comment
Ты спас мне день! спасибо хорошее пошаговое объяснение. Я использовал шаги для установки Godday ssl для внешнего интерфейса и поддерживал оба. Это работает как шарм - person Himanshu Sharma; 26.06.2021

Что ж, вам нужно добавить еще несколько свойств в конфигурацию ssl

server:
ssl:
  key-store: classpath:config/tls/keystore.p12
  key-store-password: password ##this will be your certificate password
  key-store-type: PKCS12
  ciphers: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  enabled-protocols: TLSv1.2
http2:
  enabled: true

Убедитесь, что файл хранилища ключей p12 присутствует в пути к классам (src / main / resources) в config / tls

Но для создания файла хранилища ключей используйте следующую команду openssl, где вы будете использовать файлы .crt и .key для создания файла .p12.

.crt и .key присутствуют в папке CA, а файл p12 будет создан в CA

Обратите внимание, что вам будет предложено ввести пароль сертификата после выполнения приведенной ниже команды.

openssl pkcs12 -export -in CA/certificate.crt -inkey CA/certificate.key -name certificate -out CA/certificate.p12

Если вы хотите добавить этот сертификат в свой локальный cacert, используйте команду ниже

под jre \ lib \ security

keytool -importcert -noprompt -trustcacerts  -alias ca.certificate  -file   CA/certificate.crt -keystore   cacerts -storepass changeit
person Mohammad Javed    schedule 29.04.2020

Не используйте Spring-boot для SSL-соединений. Позвольте обратному прокси-серверу обрабатывать завершение SSL.
Так что возможно, что инструмент может автоматически обновлять ваши сертификаты (например, certbot).
И вам не нужно помещать (sercret) частный -ключ к вашему приложению.

Проще поделиться своим приложением. Администратору сервера нужно только настроить обратный прокси (или иметь что-то знакомое в облачных системах, например, Kubernetes), и он может масштабировать ваше приложение.

Преимущества

  • Масштабируемое приложение
  • Более простая пружинная установка
  • Никаких секретов в вашем приложении
  • Упрощенное использование приложения (#cloudSystems)
  • Большинство обратных прокси совместимы с certbot
person akop    schedule 20.12.2020