Как заставить HTTPS работать в вашей локальной среде разработки за 5 минут

1*8XwjYNPlrj0paEvIjn0Dcw

Практически любой веб-сайт, который вы посещаете сегодня, защищен HTTPS. Если ваш еще нет, это должно быть. Защита сервера с помощью HTTPS также означает, что вы не можете отправлять запросы на сервер с сервера, который не защищен HTTPS. Это создает проблему для разработчиков, использующих локальную среду разработки, поскольку все они работают из коробки.

Во время стартапа, в котором я работал, мы решили защитить наши конечные точки AWS Elastic Load Balancer с помощью HTTPS как часть шага к повышению безопасности. Я столкнулся с ситуацией, когда запросы моей локальной среды разработки к серверу начали отклоняться.

Быстро поискав Google позже, я нашел несколько статей, похожих на эту, эту или эту с подробными инструкциями о том, как я могу применить HTTPS на localhost. Кажется, ни одна из этих инструкций не сработала даже после того, как я их верно придерживался. Chrome всегда бросал NET::ERR_CERT_COMMON_NAME_INVALID ошибка у меня.

1*cQyGAORXHxsrhs5KRRBOGQ

Проблема

Все подробные инструкции, которые я нашел, были правильными на момент их написания. Больше нет.

После тонны поиска Google я обнаружил, что причина отклонения моего локального сертификата заключалась в том, что Chrome прекратил поддержку соответствия commonName в сертификатах, фактически требуя subjectAltName с января 2017 года.

Решение

Мы будем использовать OpenSSL для создания всех наших сертификатов.

Шаг 1: корневой сертификат SSL

Первым шагом является создание корневого сертификата Secure Sockets Layer (SSL). Затем этот корневой сертификат можно использовать для подписи любого количества сертификатов, которые можно создать для отдельных доменов. Если вы не знакомы с экосистемой SSL, эта статья от DNSimple хорошо представит корневые сертификаты SSL.

Сгенерируйте ключ RSA-2048 и сохраните его в файле rootCA.key. Этот файл будет использоваться в качестве ключа для создания корневого сертификата SSL. Вам будет предложено ввести парольную фразу, которую вам нужно будет вводить каждый раз, когда вы используете этот конкретный ключ для создания сертификата.

openssl genrsa -des3 -out rootCA.key 2048

Вы можете использовать сгенерированный ключ для создания нового корневого сертификата SSL. Сохраните его в файле с названиемrootCA.pem. Этот сертификат будет действителен 1024 дня. Вы можете изменить его на любое количество дней. Вам также будет предложено ввести другую необязательную информацию.

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem
1*76xehIse7mPGF094ojiBBw

Шаг 2. Доверяйте корневому сертификату SSL

Прежде чем вы сможете использовать только что созданный корневой сертификат SSL, чтобы начать выдачу сертификатов домена, необходимо выполнить еще один шаг. Вам нужно сообщить своему Mac доверять вашему корневому сертификату, чтобы все отдельные сертификаты, выданные им, также были вверены.

Откройте Keychain Access на Mac и перейдите к категории «Сертификаты» в System keychain. Оказавшись там, импортируйте rootCA.pem с помощью Файл > Импорт элементов. Дважды щелкните импортируемый сертификат и измените раскрывающееся меню «При использовании этого сертификата:». к Всегда Трв разделе Доверие.

Ваш сертификат должен выглядеть примерно так в Keychain Access, если вы правильно следовали указаниям до сих пор.

1*NWwMb0yV9ClHDj87Kug9Ng

Шаг 2: SSL-сертификат домена

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

Создайте новый файл конфигурации OpenSSL server.csr.cnf поэтому вы можете импортировать эти настройки при создании сертификата вместо того, чтобы вводить их в командную строку.

[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[dn]
C=US
ST=RandomState
L=RandomCity
O=RandomOrganization
OU=RandomOrganizationUnit
emailAddress=hello@example.com
CN = localhost

Создать v3.ext файл для создания сертификата X509 v3. Обратите внимание, как мы уточняем subjectAltName здесь.

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost

Создайте ключ сертификата для localhost с помощью параметров конфигурации, сохраненных в server.csr.cnf. Этот ключ сохраняется в server.key.

openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config <( cat server.csr.cnf )

Запрос на подписание сертификата отправляется через корневой сертификат SSL, созданный ранее для создания сертификата домена localhost. Результатом является файл сертификата под названием server.crt.

openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256 -extfile v3.ext
1*kulsSyc0-ylsevP5eIlktA

Используйте новый сертификат SSL

Теперь вы готовы защитить свой localhost из HTTPS. Переместите server.key и server.crt файлы в доступное место на вашем сервере и включайте их при запуске сервера.

В приложении Express, написанном на Node.js, вот как это можно сделать. Убедитесь, что вы делаете это только для вашей местной среды. Не используйте это в производстве.

1*89r7TnYG49V3zMoUnfOP7Q

Надеюсь, это руководство было для вас полезным. Если вы не умеете запускать приведенные команды самостоятельно, я создал набор удобных сценариев, которые можно быстро запустить для генерации сертификатов. Более подробную информацию можно найти в репозитории GitHub.

Мне нравится помогать коллегам-разработчикам. Следите за мной в Twitter и сообщайте мне, если у вас есть предложения или отзывы. Если вы хотите выразить свою благодарность любой моей работе, будь то сообщение в блоге, проект с открытым кодом или просто смешной твит, вы можете угостить меня чашкой кофе.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *