menu icon

Създайте свой собствен SSL сертифициращ орган (CA) за локално HTTPS разработване на сайтове

През 2018 г. Google започна да препоръчва сайтовете да приемат HTTPS криптиране, като маркират сайтовете, които не използват SSL сертификат, като „несигурни“ в своя браузър Chrome. Това беше широко прието като добра идея, тъй като осигуряването на уеб трафик защитава както собственика на сайта, така и неговите клиенти.

Орган за сертифициране (CA – Certificate Authority), също понякога наричан сертифициращ орган, е компания или организация, която действа за валидиране на самоличността на субекти (като уебсайтове, имейл адреси, компании или отделни лица) и обвързването им с криптографски ключове чрез издаване на електронни документи, известни като цифрови сертификати.

Въпреки че Let’s Encrypt и неговият API направи изключително лесно за всеки да генерира и инсталира SSL сертификати на своите сървъри, това не помага много на разработчиците с HTTPS в техните среди за разработка. Създаването на локален SSL сертификат за обслужване на вашите сайтове за разработка през HTTPS може да бъде трудна работа. Дори и да успеете да генерирате самоподписан сертификат, пак ще получите грешки в поверителността на браузъра.

В тази статия ще разгледаме създаването на ваш собствен сертифициращ орган (CA) за вашите локални сървъри, така че да можете да стартирате HTTPS сайтове локално без проблем.

Защо да използвате HTTPS локално?

Защо просто не използвате обикновен HTTP локално? Защото, ако вашият производствен сайт е само с HTTPS и разработвате локално на обикновен HTTP, вашите среди за разработка и производство не са толкова сходни, колкото биха могли да бъдат.

Определено искате вашата среда за разработка да отразява производството възможно най-близо. Когато това не стане, вие каните да се появят повече проблеми в производството, които не са се появили в разработката. Изпълнението на HTTP, когато производственият ви сайт е само HTTPS, определено е ненужен риск. Дори в ситуация, в която не можете да огледате перфектно производствената си среда, все пак ще искате да стартирате HTTPS локално или ще се борите с SSL предупреждения за смесено съдържание цял ден.

Ако някога сте се опитвали да сърфирате в локален сайт чрез HTTPS, който няма конфигуриран SSL сертификат, вероятно сте виждали следното съобщение в Chrome:

Или следното във Firefox:

Други браузъри имат различни съобщения, но основният мотив е същия.

Един от начините да заобиколите това е да превключите вашата локална среда за разработка на WordPress към нещо като LocalWP, DevKinsta или дори Laravel Valet, които предлагат локални SSL решения от кутията. Недостатъкът е, че това означава промяна на вашия работен процес за разработка, което не е идеално, ако се чувствате по-комфортно с това, което вече имате, особено ако то вече съответства на вашата производствена среда.

Търсенето на локално SSL решение онлайн често ще доведе до слизане в заешката дупка на самоподписаните сертификати. Въпреки това опитът да получите самоподписан SSL сертификат, работещ с вашия локален сървър, е доста гаден, ако не използвате инструмент, който го обработва вместо вас, което ви връща към необходимостта да промените локалните си среди за разработка.

Основният проблем с локално самоподписаните сертификати е, че те също трябва да бъдат доверени от вашия браузър. Просто настройването на локален самоподписан сертификат не е достатъчно. В крайна сметка получавате същото съобщение на браузъра, но този път с ERR_CERT_AUTHORITY_INVALID. Това се случва, защото браузърът иска да провери валидността на този сертификат със сертифициращ орган и не може. Така че решението е да станете свой собствен CA!

Как работи

За да поискате SSL сертификат от CA като Verisign или GoDaddy, вие им изпращате заявка за подписване на сертификат (CSR) и те ви дават SSL сертификат в замяна, че са подписали с помощта на техния основен сертификат и частен ключ. Всички браузъри имат копие (или достъп до копие от операционната система) на основния сертификат от различните CA, така че браузърът може да провери дали вашият сертификат е подписан от доверен CA.

Ето защо, когато генерирате самоподписан сертификат, браузърът не му вярва. Не е подписан от CA. Начинът да заобиколим това е да генерираме собствен основен сертификат и частен ключ. След това добавяме основния сертификат към всички устройства, които притежаваме, само веднъж и тогава всички самоподписани сертификати, които генерираме, ще бъдат изначално надеждни.

Да станете (малък) сертифициращ орган

Някак нелепо е колко лесно е да генерирате файловете, необходими, за да станете сертифициращ орган. Наистина са необходими само две команди. Нека разгледаме как можем да направим това на macOS и Linux и след това да разгледаме как работи в операционната система Windows.

Генериране на частен ключ и основен сертификат на macOS Monterey и Linux

Тъй като и двете macOS и Linux са Unix-подобни операционни системи, процесите за генериране на необходимите файлове са идентични.

Единствената истинска разлика между двете е, че на macOS може да се наложи да инсталирате приложението за команден ред OpenSSL. За да направите това, ако все още го нямате, инсталирайте homebrew, което ще ви позволи да инсталирате OpenSSL.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install openssl

Повечето дистрибуции на Linux идват с инсталиран OpenSSL. Ако не, може да се инсталира чрез вашия мениджър на пакети по подразбиране.

След това можем да създадем местоположение за съхраняване на нашите локални файлове със сертификати. Това не е изискване, но улеснява намирането на ключовете по-късно.

С тази настройка сме готови да генерираме частния ключ, за да станем локален CA:

openssl genrsa -des3 -out myCA.key 2048

OpenSSL ще поиска парола, която препоръчваме да не пропускате и да я пазите. Паролата ще попречи на всеки, който получи личния ви ключ, да генерира свой собствен основен сертификат. Резултатът трябва да изглежда така:

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

Ще бъдете подканени да въведете паролата на частния ключ, който току-що сте избрали, и куп въпроси. Отговорите на тези въпроси не са толкова важни. Те се показват при разглеждане на сертификата, което почти никога няма да направите. Предлагам да направите общото име нещо, което ще разпознаете като основен сертификат в списък с други сертификати. Това наистина е единственото нещо, което има значение.

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]:BG
State or Province Name (full name) [Some-State]:Sofia
Locality Name (eg, city) []:Sofia
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Web Wizards Ltd.
Organizational Unit Name (eg, section) []:7G
Common Name (e.g. server FQDN or YOUR name) []:Web Wizards Ltd.
Email Address []:team@webwizards.bg

Сега трябва да имате два файла: myCA.key (вашият личен ключ) и myCA.pem (вашият основен сертификат).

🎉 Поздравления, вече сте CA. Или поне нещо подобно на сертифициращ орган.

Генериране на частен ключ и основен сертификат в Windows

В Windows също е възможно да конфигурирате вашата среда да изпълнява командите openssl. Трябват ви само някой допълнителни инструменти.

Ако използвате подсистема на Windows за Linux (WSL), тогава все едно използвате Linux и командите ще работят по същия начин. Ако използвате Windows с нещо като WampServer или XAMPP, ще ви трябва начин да инсталирате помощната програма за команден ред OpenSSL в Windows. Най-лесният начин да направите това е да инсталирате Git за Windows, който идва в комплект с OpenSSL и помощната програма Git Bash.

След като отворите прозорец на Git Bash, можете да изпълнявате същите команди като за macOS или Linux, с една малка разлика. Поради начина, по който някои конзолни приложения (по-специално OpenSSL) работят в Git Bash, трябва да добавяте префикс на всички openssl команди с помощта на програмата winpty.

Така например, следната команда е как да генерирате частния ключ, за да станете локален CA в Git Bash:

winpty openssl genrsa -des3 -out myCA.key 2048

Другите малки разлики са пътищата на файловете в Git Bash. Когато отворите екземпляр на Git Bash, домашната директория в терминала се съпоставя с вашата потребителска директория в Windows, но със структура на директория, подобна на Linux. Така че, ако вашата потребителска директория се намира на c:\Users\WebWizards в Windows, вашата домашна директория на Git Bash ще бъде c/Users/WebWizards.

Инсталиране на вашия основен сертификат

За да станете истински CA, трябва да получите своя основен сертификат на всички устройства по света.

Но не е нужно да ставаме истински CA. Просто трябва да бъдем CA за устройствата, които притежавате. Трябва да добавим основния сертификат към всички лаптопи, настолни компютри, таблети и телефони, които имат достъп до вашите HTTPS сайтове. Това може да бъде малко болезнено, но добрата новина е, че трябва да го направим само веднъж. Основният ни сертификат ще бъде добър, докато не изтече.

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

Чрез CLI

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

Чрез приложението Keychain на macOS

  1. Отворете приложението macOS Keychain
  2. Ако е необходимо, уверете се, че сте избрали System Keychain (по-старите версии на macOS по подразбиране използват този ключодържател)
  3. Отидете на File > Import Items…
  4. Изберете вашия файл с личен ключ (т.е. myCA.pem)
  5. Потърсете каквото и да сте отговорили на въпроса за „Common Name“ по-горе
  1. Щракнете два пъти върху основния си сертификат в списъка
  2. Разгънете секцията Trust
  3. Променете стойността в полето „When using this certificate:“ на Always Trust
  4. Затворете прозореца със сертификати
  5. По време на процеса може да ви помоли да въведете паролата си (или да сканирате пръста си), направете го
  6. 🎉 Честито!

Добавяне на основния сертификат към Linux

Има толкова много Linux дистрибуции, но Ubuntu е най-популярната. Следователно тези инструкции ще обхванат Ubuntu.

  1. Ако още не е инсталиран, инсталирайте пакета ca-certificates.
sudo apt-get install -y ca-certificates
  1. Копирайте файла myCA.pem в директорията /usr/local/share/ca-certificates като файл myCA.crt.
sudo cp ~/certs/myCA.pem /usr/local/share/ca-certificates/myCA.crt
  1. Актуализирайте хранилището на сертификати.
sudo update-ca-certificates

Можете да проверите дали сертификатът е инсталиран, като изпълните следната команда:

awk -v cmd='openssl x509 -noout -subject' '/BEGIN/{close(cmd)};{print | cmd}' < /etc/ssl/certs/ca-certificates.crt | grep Wizards

Ако е инсталиран правилно, ще видите подробностите за основния сертификат.

subject=C = BG, ST = Sofia, L = Sofia, O = Web Wizards Ltd., OU = PL, CN = Web Wizards Ltd., emailAddress = team@webwizards.bg

Добавяне на основния сертификат към Windows 10

  1. Отворете „Microsoft Management Console“, като използвате клавишната комбинация Windows + R, напишете mmc и щракнете върху Open
  2. Отидете на File > Add/Remove Snap-in
  3. Щракнете върху Certificates и Add
  4. Изберете Computer Account и щракнете върху Next
  5. Изберете Локален компютър, след което щракнете върху Finish
  6. Щракнете върху OK, за да се върнете към прозореца на MMC
  7. Щракнете двукратно върху Certificates (local computer), за да разширите изгледа
  8. Изберете Trusted Root Certification Authorities, щракнете с десния бутон върху Certificates в средната колона под „Object Type“ и изберете All Tasks, след което Import
  9. Щракнете върху Next и след това върху Browse. Променете разширението на файла от падащото меню до полето за име на файл на All Files (*.*) и намерете файла myCA.pem, щракнете върху Open, след това върху Next
  10. Изберете Place all certificates in the following store. „Trusted Root Certification Authorities store“ е по подразбиране. Щракнете върху Next и след това върху Finish, за да приключите.

Ако всичко е минало по план, трябва да видите своя CA сертификат, сред останалите в Trusted Root Certification Authorities > Certificates.

Създаване на сертификати, подписани от CA за вашите сайтове за локална разработка

Сега ние сме CA на всички наши устройства и можем да подписваме сертификати за всички нови сайтове за локална разработка, които се нуждаят от HTTPS. Първо създаваме частен ключ за локалния сайт. Имайте предвид, че именуваме частния ключ, като използваме URL адреса на името на домейна на сайта за лоакална разработка. Това не е задължително, но улеснява управлението, ако имате няколко сайта:

openssl genrsa -out webwizards.test.key 2048

След това създаваме Заявка за подпис на сертификат – Certificate Signing Request (CSR):

openssl req -new -key webwizards.test.key -out webwizards.test.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]:BG
State or Province Name (full name) [Some-State]:Sofia
Locality Name (eg, city) []:Sofia
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Web Wizards Ltd.
Organizational Unit Name (eg, section) []:7G
Common Name (e.g. server FQDN or YOUR name) []:webwizards.test
Email Address []:team@webwizards.bg

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

Накрая ще създадем конфигурационен файл X509 V3 certificate extension config, който се използва за дефиниране на алтернативното име на субект Subject Alternative Name (SAN) за сертификата. В нашия случай ще създадем конфигурационен файл, наречен webwizards.test.ext, съдържащ следния текст:

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

[alt_names]
DNS.1 = webwizards.test

Ще изпълняваме openssl x509, защото командата x509 ни позволява да редактираме настройките за доверие на сертификата. В този случай ние го използваме, за да подпишем сертификата във връзка с конфигурационния файл, който ни позволява да зададем алтернативно име на субект. Ето препратка към първоначалния код от Stack Overflow.

Сега изпълняваме командата за създаване на сертификата: използвайки нашия CSR, CA частния ключ, CA сертификата и конфигурационния файл:

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

Сега имаме три файла: webwizards.test.key (частният ключ), webwizards.test.csr (заявката за подписване на сертификат или csr файл) и webwizards.test.crt (подписаният сертификат). Можем да конфигурираме локални уеб сървъри да използват HTTPS с частния ключ и подписания сертификат.

Ако използвате MAMP Pro, версия 6.0 въведе вградена SSL поддръжка. Можете да го активирате, като поставите отметка в квадратчето SSL под избрания от вас уеб сървър.


Ако предпочитате да използвате локално подписания сертификат, който току-що настроихме, можете да направите това, като отворите „Expert“, щракнете върху раздела SSL и изберете вашите файлове „Certificate“ и „Certificate key“ (private key).

Ако използвате Linux или Windows среда, която използва Nginx, можете да използвате инструкцията за Инсталиране на WordPress в Ubuntu 20.04 от тук – Install WordPress on Ubuntu 20.04 series.

Ако сте на Linux или Windows и използвате Apache, ще трябва да активирате SSL мода на Apache и да конфигурирате виртуален хост на Apache за порт 443 за локалния сайт. Това ще изисква от вас да добавите директивите SSLEngine, SSLCertificateFile и SSLCertificateKeyFile и да насочите последните две към току-що създадените файлове със сертификат и ключ.

<VirtualHost *:443>
   ServerName webwizards.test
   DocumentRoot /var/www/webwizards-test

   SSLEngine on
   SSLCertificateFile /path/to/certs/webwizards.test.crt
   SSLCertificateKeyFile /path/to/certs/webwizards.test.key
</VirtualHost>

Към момента няма готови инструкции как да направите това в Windows, използвайки IIS, тъй като WordPress не е най-лесният за конфигуриране на IIS системи.

Не е нужно да създаваме нов CA за всеки сайт. Можем просто да повторим тази последна част от създаването на сертификат за всеки друг сайт за локална разработка.

Shell Script

За да направите нещата още по-бързо, ето един удобен shell скрипт, който можете да промените за вашите собствени цели. Трябва да работи на macOS, Linux или Windows чрез Git Bash:

#!/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 сертификати, е mkcert. Ако нямате нищо против да използвате един от различните мениджъри на пакети, изброени във файла readme на mkcert, за да инсталирате инструмента, това е солидна алтернатива за създаване на локално надеждни SSL сертификати. Недостатъкът е, че той инсталира само основния CA сертификат за вас на вашата локална машина и създава локално подписани SSL сертификати, все още трябва да конфигурирате сертификатите ръчно за всеки локален сайт.

Заключение

Ето как да станете собствен локален сертифициращ орган за издаване на сертификати, за да подписвате локални SSL сертификати и да използвате HTTPS на локалните си сайтове. Надяваме се, че това ще премахне ужасяващото съобщение „Your connection is not private“ на сайтовете ви за локална разработка.

Петьо Лазаров


Добре дошли в нашия техномагически свят!

Аз съм Петьо Лазаров, Web Developer, и този блог е порталът ми към вълшебството на технологията.

Всеки ред написан код, всяка иновация - това са част от магията, която обичам да създавам. От големи технологични предизвикателства до спонтанни моменти на вдъхновение, ви каня да споделяте този вълшебен път с мен.

Благодаря за това, че сте тук, и се подгответе за изцяло ново измерение от техническо вълшебство! 🌌✨🖥️