Як змусити HTTPS працювати над місцевим середовищем розробки за 5 хвилин

Практично будь-який веб-сайт, який ви відвідуєте сьогодні, захищений HTTPS. Якщо вашого ще немає, він повинен бути. Захист вашого сервера за допомогою HTTPS також означає, що ви не можете надсилати запити на цей сервер із того, який не захищений HTTPS. Це створює проблему для розробників, які використовують локальне середовище розробки, оскільки всі вони працюють //localhostнестандартно.

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

Швидкий пошук у Google пізніше, я знайшов кілька статей на зразок цієї, тієї чи іншої з докладними інструкціями про те, як я можу застосувати HTTPS localhost. Здавалося, жодна з цих інструкцій не спрацювала навіть після того, як я їх релігійно дотримувався. Chrome завжди видавав мені NET::ERR_CERT_COMMON_NAME_INVALIDпомилку.

Проблема

Всі докладні інструкції, які я знайшов, були правильними на час написання. Більше ні.

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

Рішення

Ми будемо використовувати OpenSSL для генерації всіх наших сертифікатів.

Крок 1: Кореневий сертифікат SSL

Першим кроком є ​​створення сертифіката корінних захищених сокетів (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 і перейдіть до категорії Сертифікати у вашому системному брелоку. Опинившись там, імпортуйте за rootCA.pemдопомогою Файл> Імпортувати елементи. Двічі клацніть імпортований сертифікат і змініть спадне меню "При використанні цього сертифіката:" на Завжди завжди в розділі Довіра.

Ваш сертифікат повинен виглядати приблизно так у Access 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 [email protected] 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 та повідомте, якщо у вас є якісь пропозиції чи відгуки. Якщо ви хочете висловити свою вдячність за будь-яку роботу, яку я зробив, будь то публікація в блозі, проект з відкритим кодом або просто кумедний твіт, ви можете купити мені чашку кави.