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

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

Навіщо потрібен локальний HTTPS?

Чому б просто не використовувати звичайний HTTP локально? Справа в тому, що якщо ваш робочий сайт підтримує тільки HTTPS, а ви ведете локальну розробку по HTTP, то в такому випадку ваші середовища розробки та продакшну будуть не ідентичні. Наприклад, моє середовище розробки для цього сайту є Ubuntu-сервер на віртуальній машині VMware під Mac. Продакшн-сайт – це Ubuntu-сервер, що працює на Linode з практично ідентичною конфігурацією.

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

Спроби отримати SSL-сертифікат для роботи з локальним сервером – так собі підхід. Виняток: використання автоматизації за типом Valet.

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

Как создать свой собственный центр сертификации SSL для локальной 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 []:[email protected]

Тепер у вас повинно бути два файли: 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 []:[email protected]

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-сертифікатів.

Прокоментувати

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *