Как создать свой собственный центр сертификации SSL для локальной HTTPS-разработки

Локальная настройка HTTPS может стать непростой задачей. Даже если вы и разберетесь с самоподписанными сертификатами, вы все равно можете столкнуться с ошибками приватности в браузере. В данной статье мы рассмотрим создание своего удостоверяющего центра (Certificate Authority, или кратко CA) для локальных серверов, чтобы вы могли без проблем запускать HTTPS-сайты.

Зачем нужен локальный HTTPS?

Почему бы просто не использовать обычный HTTP локально? Дело в том, что если ваш рабочий сайт поддерживает только HTTPS, а вы ведете локальную разработку по HTTP, то в таком случае ваши среды разработки и продакшна будут не идентичны. К примеру, моя среда разработки для этого сайта представляет собой Ubuntu-сервер на виртуальной машине VMware под Mac. Продакшн-сайт – это Ubuntu-сервер, работающий на Linode с практически идентичной конфигурацией.

Ваша среда разработки должна максимально точно соответствовать вашей рабочей среде (продакшну). Когда этого нет, вы навлекаете на себя массу проблем, которые могут возникнуть совершенно неожиданно. Поддержка HTTP-сайта, когда ваш рабочий сайт запущен по HTTPS – это ненужный риск.

Попытки получить SSL-сертификат для работы с локальным сервером – так себе подход. Исключение: использование автоматизации по типу Valet.

Если вы когда-либо пытались запускать свой HTTPS-сайт локально, вы, вероятно, видели нечто подобное:

Раньше обходным путем было создание самоподписанного сертификата и его последующее использование. Годами я использовал для этого MAMP Pro. К сожалению, сейчас это не получится сделать. Современный подход – создание своего собственного центра сертификации (CA).

Как это работает

Чтобы запросить SSL-сертификат у удостоверяющего центра, такого как Verisign  или GoDaddy, вам нужно отправить ему CSR-запрос (Certificate Signing Request). Взамен вы получаете от удостоверяющего центра сертификат, подписанный с использованием его корневого сертификата и приватного ключа. Все браузеры имеют копию корневого сертификата Verisign, потому браузер может проверить, был ли ваш сертификат подписан доверенным центром сертификации.

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

Становимся (крошечным) удостоверяющим центром

Чтобы стать удостоверяющим центром, ничего особенно сложного делать не придется. Требуются всего лишь две команды. Сначала мы генерируем наш приватный ключ:


openssl genrsa -des3 -out myCA.key 2048

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


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

Теперь мы генерируем корневой сертификат:


openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.pem

Нам будет предложено ввести кодовую фразу для приватного ключа, после чего пойдет ряд вопросов. Как на них отвечать — не так уж и важно. Все это будет отражаться затем в информации о сертификате, которая вам вряд ли потребуется. Я предлагаю задать в Common Name что-то такое, что будет понятно вам, чтобы потом распознавать свой корневой сертификат в списке других сертификатов. Это единственное, что имеет значение.


Enter pass phrase for myCA.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]:CA
State or Province Name (full name) [Some-State]:Nova Scotia
Locality Name (eg, city) []:Truro
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Delicious Brains Inc
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:Delicious Brains
Email Address []:noreply@deliciousbrains.com

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

Поздравляем, вы теперь удостоверяющий центр. Что-то вроде того.

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

Устанавливаем корневой сертификат

Нам нужно добавить корневой сертификат на все ноутбуки, ПК, планшеты и смартфоны, которые будут получать доступ к вашим HTTPS-сайтам. Возможно, это несколько неудобно, но это нужно будет сделать всего один раз. Как только наш корневой сертификат окажется на каждом устройстве, он будет действительным до истечения своего срока действия.

Добавляем корневой сертификат к macOS Keychain

Через CLI:


sudo security add-trusted-cert -d -r trustRoot -k "/Library/Keychains/System.keychain" myCA.pem

Через UI:

  1. Открываем приложение macOS Keychain.
  2. Выбираем File > Import Items…
  3. Выбираем свой приватный ключ (myCA.pem, к примеру).
  4. Ищем сертификат, отвечающий Common Name.
  5. Делаем двойной клик по корневому сертификату в списке.
  6. Раскрываем секцию Trust.
  7. Меняем «When using this certificate:» на «Always Trust»
  8. Закрываем окно сертификата.
  9. Вводим пароль (или сканируем палец).
  10. Готово.

Добавляем корневой сертификат в iOS

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

  1. Пересылаем корневой сертификат себе по email, чтобы получить к нему доступ с iOS-устройства.
  2. Кликаем по вложению в письме.
  3. Переходим в приложение settings и выбираем ‘Profile Downloaded’.
  4. Щелкаем по install.
  5. Как только установка будет выполнена, переходим обратно на страницу Settings.
  6. Переходим в раздел “General” > “About”.
  7. Прокручиваем в самый низ и щелкаем по Certificate Trust Settings.
  8. Включаем свой корневой сертификат в разделе ENABLE FULL TRUST FOR ROOT CERTIFICATES.

Создаем подписанные своим удостоверяющим центром сертификаты для сайтов в разработке

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


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

Создаем CSR:


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

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


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]:CA
State or Province Name (full name) [Some-State]:Nova Scotia
Locality Name (eg, city) []:Truro
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Delicious Brains Inc
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:Mergebot
Email Address []:noreply@mergebot.com

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

Далее мы создадим сертификат с помощью нашего CSR, приватного ключа, CA-сертификата и файла конфигурации. Но сначала нам нужно будет создать этот самый файл конфигурации.

Файл конфигурации требуется для задания расширения Subject Alternative Name (SAN), которое можно видеть в следующей секции сертификата:

Конфигурационный файл содержит следующее:

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

[alt_names]
DNS.1 = dev.deliciousbrains.com

Мы будем выполнять команду openssl x509, поскольку, как я понимаю, она необходима для выполнения подписи с помощью корневого сертификата и приватного ключа. Я нашел пример конфигурационного файла на Stack Overflow.

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


openssl x509 -req -in dev.deliciousbrains.com.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial \
-out dev.deliciousbrains.com.crt -days 825 -sha256 -extfile dev.deliciousbrains.com.ext

В итоге у меня есть три файла: dev.deliciousbrains.com.key (приватный ключ), dev.deliciousbrains.com.csr (CSR-запрос) и dev.deliciousbrains.com.crt (подписанный сертификат).

Теперь я могу настроить свой веб-сервер с помощью приватного ключа и сертификата. Если вы используете Linux-сервер, то вы можете взять инструкции из следующей статьи по ссылке. Если вы работаете с MAMP, то тогда вы можете выбрать файлы сертификата и ключа через UI:

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

Shell-скрипт

Чтобы ускорить процесс, вы можете взять следующий Shell-скрипт, который вы можете настроить под свои цели:


#!/bin/sh

if [ "$#" -ne 1 ]
then
  echo "Usage: Must supply a domain"
  exit 1
fi

DOMAIN=$1

cd ~/certs

openssl genrsa -out $DOMAIN.key 2048
openssl req -new -key $DOMAIN.key -out $DOMAIN.csr

cat > $DOMAIN.ext << EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = $DOMAIN
EOF

openssl x509 -req -in $DOMAIN.csr -CA ../myCA.pem -CAkey ../myCA.key -CAcreateserial \
-out $DOMAIN.crt -days 825 -sha256 -extfile $DOMAIN.ext

Теперь вы знаете, как создать свой собственный удостоверяющий центр для подписи ваших локальных SSL-сертификатов.

Источник: https://deliciousbrains.com

Блог про WordPress
Добавить комментарий

Получать новые комментарии по электронной почте.