

Практически любой веб-сайт, который вы посещаете сегодня, защищен HTTPS. Если ваш еще нет, это должно быть. Защита сервера с помощью HTTPS также означает, что вы не можете отправлять запросы на сервер с сервера, который не защищен HTTPS. Это создает проблему для разработчиков, использующих локальную среду разработки, поскольку все они работают из коробки.
Во время стартапа, в котором я работал, мы решили защитить наши конечные точки AWS Elastic Load Balancer с помощью HTTPS как часть шага к повышению безопасности. Я столкнулся с ситуацией, когда запросы моей локальной среды разработки к серверу начали отклоняться.
Быстро поискав Google позже, я нашел несколько статей, похожих на эту, эту или эту с подробными инструкциями о том, как я могу применить HTTPS на localhost
. Кажется, ни одна из этих инструкций не сработала даже после того, как я их верно придерживался. Chrome всегда бросал NET::ERR_CERT_COMMON_NAME_INVALID
ошибка у меня.

Проблема
Все подробные инструкции, которые я нашел, были правильными на момент их написания. Больше нет.
После тонны поиска 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

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

Шаг 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

Используйте новый сертификат SSL
Теперь вы готовы защитить свой localhost
из HTTPS. Переместите server.key
и server.crt
файлы в доступное место на вашем сервере и включайте их при запуске сервера.
В приложении Express, написанном на Node.js, вот как это можно сделать. Убедитесь, что вы делаете это только для вашей местной среды. Не используйте это в производстве.

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