Локальная настройка HTTPS может быть сложной задачей, если вы управляете собственным сертификатом как самозаверяющим сертификатом, вы все равно можете столкнуться с ошибками конфиденциальности браузера. В большинстве случаев конфигурации SSL в среде localhost браузер часто жалуется на то, что ваше соединение не является частным, как показано ниже.

Как мы можем сделать доверенный браузер из нашего локального домена?

В этой статье я расскажу вам о настройке самозаверяющих сертификатов и покажу вам трюк, позволяющий устранить ошибки конфиденциальности браузера и интегрировать самозаверяющий сертификат в приложение с весенней загрузкой.

Самоподписанный сертификат и приложение HTTP-загрузки Spring

Для настройки HTTPS для Spring Boot требуется два шага: получение сертификата SSL и настройка SSL в Spring Boot. Собираетесь ли вы создать самозаверяющий сертификат или уже получили его от корневого сертификата центра (CA), я покажу вам, как создать самозаверяющий сертификат с корневым сертификатом CA и как включить HTTPS в приложении Spring Boot.

  1. Создание сертификата SSL
  2. Настройка SSL в Spring Boot.

Предпосылки

  • Java 1.8
  • Пружинный ботинок 2.x.x
  • Инструмент OpenSSL

Мы можем сами сгенерировать сертификат SSL (самоподписанный сертификат). Он предназначен только для целей разработки и тестирования. В производстве мы должны использовать сертификат, выданный официальным доверенным центром сертификации (CA).

В этом руководстве мы собираемся изучить следующие элементы:

  • Создать корневой сертификат ЦС
  • Создание самозаверяющего сертификата с CA-Root
  • Преобразование открытого сертификата в хранилище ключей PKCS12, используемое springboot
  • Прикрепите файл PKCS12 в свойствах приложения Springboot

Корневой сертификат ЦС

1 # Создать корень CA

openssl genrsa -des3 -out myCARoot.key 2048

Вам будет предложено ввести кодовую фразу, которую я рекомендую не пропускать и сохранить в безопасности. Кодовая фраза не позволит любому, кто получит ваш закрытый ключ, создать собственный корневой сертификат. Результат должен выглядеть так. В этом примере: я использую пароль для тестирования.

Generating RSA private key, 2048 bit long modulus
.................................................................+++
.....................................+++
e is 65537 (0x10001)
Enter pass phrase for myCARoot.key: password
Verifying - Enter pass phrase for myCARoot.key:password

2 # Создание корневого сертификата ЦС

openssl req -x509 -new -nodes -key myCARoot.key -sha256 -days 3650 -out myCARoot.pem

Вам будет предложено ввести кодовую фразу вашего закрытого ключа (пароля) и ряд вопросов. Ответы на эти вопросы не так уж и важны. Они появляются при просмотре сертификата, чего вы почти никогда не сделаете. Я предлагаю сделать общее имя чем-нибудь, что вы будете распознавать как свой корневой сертификат в списке других сертификатов. Это действительно единственное, что имеет значение.

Enter pass phrase for myCARoot.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:KH
State or Province Name (full name) [Some-State]:Phnom Penh
Locality Name (eg, city) []:Phnom Penh
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Test Inc
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:127.0.0.1
Email Address []:[email protected]

Теперь у вас должно быть два файла: myCARoot.key (закрытый ключ) и myCARoot.pem (корневой сертификат).

Установка корневого сертификата

Нам нужно добавить корневой сертификат на все ноутбуки, настольные компьютеры, планшеты и телефоны, которые будут получать доступ к вашим HTTPS-сайтам. Это может быть немного неприятно, но хорошая новость заключается в том, что нам нужно сделать это только один раз. Как только наш корневой сертификат (myCARoot.pem) будет на каждом устройстве, он будет действителен, пока не истечет срок его действия.

Самоподписанный сертификат с CA-Root

Теперь, когда у вас есть ЦС на всех наших устройствах, мы можем подписывать сертификаты для любых новых сайтов разработчиков, которым нужен HTTPS. Сначала мы создаем закрытый ключ:

openssl genrsa -out dev.localhost.com.key 2048

Затем файл CSR:

openssl req -new -key dev.localhost.com.key -out dev.localhost.com.csr

Вы получите те же вопросы, что и выше, и, опять же, ваши ответы не имеют значения. На самом деле они имеют еще меньшее значение, потому что вы не увидите этот сертификат в списке рядом с другими.

Вас сейчас попросят ввести информацию, которая будет включена в ваш запрос на сертификат. То, что вы собираетесь ввести, называется отличительным именем или DN. Поля довольно много, но некоторые из них можно оставить пустыми. Для некоторых полей будет значение по умолчанию, если вы введете «.», Поле останется пустым.

Country Name (2 letter code) [AU]:KH
State or Province Name (full name) [Some-State]:Phnom Penh
Locality Name (eg, city) []:Phnom Penh
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Test Inc
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:127.0.0.1
Email Address []:[email protected]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Создайте файл общедоступного сертификата с помощью файла CSR

нам нужно создать файл конфигурации csr (csr.config): файл конфигурации необходим для определения расширения альтернативного имени субъекта (SAN). новый файл с именем csr.config и добавил следующее содержимое:

[req]
days                   = 3650
serial                 = 1
distinguished_name     = req_distinguished_name
x509_extensions        = v3_ca
[req_distinguished_name]
countryName            = Country
stateOrProvinceName    = State
localityName           = Locality
organizationName       = Organizational Name
organizationalUnitName = Organizational Unit Name
commonName             = Common Name (Domain Name)
emailAddress           = Email Address
[ v3_ca ]
# The extentions to add to a self-signed cert
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always,issuer:always
# THIS IS VERY IMPORTANT IF YOU WANT TO USE THIS CERTIFICATION AS AN AUTHORITY!!!
basicConstraints       = CA:TRUE
keyUsage               = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyAgreement, keyCertSign
subjectAltName         = @alt_names
issuerAltName          = issuer:copy
[alt_names]
DNS.1 = dev.localhost.com
DNS.2 = dev.localhost.com.127.0.0.1.io
IP.1= 127.0.0.1

Теперь запускаем команду для создания публичного сертификата:

openssl x509 -req -in dev.localhost.com.csr -CA myCARoot.pem -CAkey myCARoot.key -CAcreateserial -out dev.localhost.com.crt -days 3650 -sha256 -extfile csr.config  -extensions v3_ca

Вам будет предложено ввести кодовую фразу для закрытого ключа CA.

После выполнения описанных выше шагов у вас должно быть три файла:

  • dev.localhost.com.key (закрытый ключ),
  • dev.localhost.com.csr (запрос на подпись сертификата) и
  • dev.localhost.com.crt (подписанный сертификат)

Преобразование формата PKCS # 12 или PFX

openssl pkcs12 -export -out dev.localhost.com.p12 -inkey dev.localhost.com.key -in dev.localhost.com.crt

Нарушение команды:

  • openssl - команда для выполнения OpenSSL
  • pkcs12 - файловая утилита для файлов PKCS # 12 в OpenSSL
  • -export -out dev.localhost.com.p12 - экспортировать и сохранить файл PFX как dev.localhost.com.p12
  • -inkey dev.localhost.com.key - использовать файл закрытого ключа dev.localhost.com.key в качестве закрытого ключа для объединения с сертификатом.
  • -in dev.localhost.com.crt - используйте dev.localhost.com.crt в качестве сертификата, с которым будет объединен закрытый ключ.

Включение SSL HTTPS в Java-приложении Springboot

Чтобы включить HTTPS для приложения Spring Boot 2, скопируйте dev.localhost.com.p12 в папку ресурсов springboot, а затем настройте свойства приложения.

Свойства приложения

spring:
  application:
    name: application
---
server:
  ssl:
    key-store: classpath:dev.localhost.com.p12
    key-store-password: password
    key-store-type: pkcs12
    key-password: password
  port: 8443

Тестирование API

https://127.0.0.1:8443

Доступ с домена: https://dev.localhost.com:8443

Вам нужно добавить эту строку 127.0.0.1 dev.localhost.com в / etc / hosts

echo '127.0.0.1 dev.localhost.com'>> /etc/hosts'

Другие API: https://127.0.0.1:8443/api/test/data

Теперь проблема с ошибкой исчезла, и браузер признает, что сервер безопасен и надежен.

Заключение

Я надеюсь, что эта статья может дать вам базовые представления о том, как создавать самозаверяющие сертификаты и включать HTTP в приложении springboot.

Если эта статья полезна, поддержите нажатие кнопки хлопать 👏 и помогите поделиться с другими читателями, чтобы они тоже узнали эту историю.

Полный пример исходного кода доступен на GitHub.