Как да накарате HTTPS да работи върху вашата местна среда за разработка за 5 минути

Почти всеки уебсайт, който посещавате днес, е защитен от HTTPS. Ако вашият все още не е, трябва да бъде. Защитата на вашия сървър с HTTPS също означава, че не можете да изпращате заявки до този сървър от такъв, който не е защитен от HTTPS. Това създава проблем за разработчиците, които използват локална среда за разработка, тъй като всички те работят //localhostнестандартно.

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

Бързо търсене в Google по-късно, намерих няколко статии като тази, тази или тази с подробни инструкции как мога да приложа HTTPS localhost. Нито една от тези инструкции изглежда не работи дори след като ги спазвах религиозно. Chrome винаги ми изпращаше NET::ERR_CERT_COMMON_NAME_INVALIDгрешка.

Проблемът

Всички подробни инструкции, които намерих, бяха верни за времето, когато бяха написани. Вече не.

След тон гугъл открих, че причината за отхвърлянето на локалния ми сертификат е, че Chrome оттегли поддръжката за съвпадение на commonName в сертификатите, всъщност изискваща subjectAltName от януари 2017 г.

Решението

Ще използваме OpenSSL, за да генерираме всички наши сертификати.

Стъпка 1: Корен SSL сертификат

Първата стъпка е да създадете сертификат за корен на защитени гнезда (SSL). След това този корен сертификат може да се използва за подписване на произволен брой сертификати, които може да генерирате за отделни домейни. Ако не сте запознати с SSL екосистемата, тази статия от DNSimple върши добра работа по въвеждането на Root SSL сертификати.

Генерирайте RSA-2048 ключ и го запазете във файл rootCA.key. Този файл ще се използва като ключ за генериране на корен SSL сертификат. Ще бъдете подканени да въведете парола, която ще трябва да въведете всеки път, когато използвате този конкретен ключ за генериране на сертификат.

openssl genrsa -des3 -out rootCA.key 2048

Можете да използвате генерирания от вас ключ, за да създадете нов Root SSL сертификат. Запазете го във файл с име rootCA.pem. Този сертификат ще има валидност 1024 дни. Чувствайте се свободни да го промените на произволен брой дни, които искате. Ще бъдете подканени и за друга незадължителна информация.

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem

Стъпка 2: Доверете се на основния SSL сертификат

Преди да можете да използвате новосъздадения Root 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 [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 и ме уведомете, ако имате някакви предложения или отзиви. Ако искате да покажете своята благодарност към някоя от работата, която съм свършил, било то публикация в блог, проект с отворен код или просто забавен туит, можете да ми купите чаша кафе.