Как mkcert решает проблему HTTPS в локальной разработке за две команды
Локальная разработка с HTTPS превращается в кошмар из предупреждений браузеров, ручного импорта сертификатов и отключения строгих настроек безопасности. mkcert автоматически настраивает доверенный локальный центр сертификации, убирает зелёные замочки с предупреждениями и позволяет использовать геол…
Зелёный замочек на localhost за две минуты: как mkcert чинит HTTPS в локальной разработке
Запускаете https://localhost:8000, а Chrome показывает предупреждение: «Ваше соединение не защищено». Кликаете «Дополнительно» и идёте дальше — но это ломает автоматические тесты, заставляет отключать строгий режим HTTPS в инструментах и заставляет каждого члена команды вручную импортировать сертификаты на своей машине. В итоге HTTPS в разработке превращается в набор костылей: то забыли импортнуть, то срок годности сертификата истёк, то браузер упрямится. А между тем современные браузеры блокируют важные функции — геолокацию, камеру, Service Workers, Push-уведомления — если соединение идёт по HTTP. Получается, что локальная разработка с HTTPS — не роскошь, а требование.
mkcert чинит это одним движением: создаёт локальный центр сертификации (CA), который браузеры и системы начинают воспринимать как доверенный, и выпускает сертификаты для любых доменов — localhost, *.test, app.local — одной командой. Никаких танцев с OpenSSL, никаких ежегодных обновлений. Только зелёный замочек, работающая геолокация в PWA и отсутствие предупреждений при каждом запуске сервера.
Почему браузеры не доверяют localhost (и почему это мешает)
Современные браузеры требуют HTTPS для доступа к чувствительным функциям: геолокации, камере, микрофону, Service Workers, Push-уведомлениям, да даже загрузке файлов в PWA. Если запустить локальный сервер на http://localhost:3000, браузер покажет предупреждение «Ваше соединение не защищено». Кликните «Дополнительно» → «Продолжить», но Chrome всё равно будет блокировать navigator.geolocation. Приходится переключать флаги (chrome://flags/#unsafely-treat-insecure-origin-as-secure), терять консистентность между машинами и членами команды, хранить настройки в .bashrc и README.md. В результате HTTPS в разработке превращается в набор хрупких хаков, которые легко забыть или пропустить.
Как mkcert вписывается в существующую модель доверия
mkcert не обходит систему безопасности — он использует её по назначению. Инструмент создаёт локальный центр сертификации, корневой сертификат которого добавляется в системное хранилище. Браузеры и ОС начинают доверять любым сертификатам, подписанным этим локальным CA, так же, как они доверяют сертификатам от Let’s Encrypt или DigiCert.
Вот ключевое отличие от самоподписанных сертификатов: браузеры продолжают помечать самоподписанные сертификаты как недоверенные, даже если вы вручную импортировали их в хранилище. mkcert же решает проблему централизованно — один раз установили доверие к локальному CA, и все сгенерированные им сертификаты работают без предупреждений.
Установка за три команды — и доверие настроено на всех платформах
Windows (Scoop)
Если у вас Windows, проще всего установить mkcert через Scoop:
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
irm get.scoop.sh | iex
scoop bucket add extras
scoop install mkcert
mkcert -install
Команда mkcert -install создаёт локальный CA и добавляет его корневой сертификат в системное хранилище Windows. После этого Chrome, Edge и другие браузеры перестают ругаться на локальные сертификаты.
macOS (Homebrew)
На macOS всё ещё проще:
brew install mkcert
mkcert -install
Корневой сертификат добавляется в системное хранилище macOS, и Safari тоже начинает доверять локальным сертификатам.
Linux (Debian/Ubuntu)
На Linux используйте пакет libnss3-tools и скачайте бинарник:
sudo apt install libnss3-tools
curl -s https://api.github.com/repos/FiloSottile/mkcert/releases/latest | grep browser_download_url | grep linux-amd64 | cut -d '"' -f 4 | wget -qi -
chmod +x mkcert-v*-linux-amd64
sudo mv mkcert-v*-linux-amd64 /usr/local/bin/mkcert
mkcert -install
После установки корневой сертификат CA добавляется в NSS-базу Firefox и системное хранилище Linux.
WSL: чтобы сертификаты были доверены и в Windows, и в WSL
Если вы используете WSL, порядок действий важен:
- В Windows установите mkcert и запустите
mkcert -install. Это создаст локальный CA и добавит его корневой сертификат в системное хранилище Windows. - В WSL узнайте путь к корневому сертификату Windows:
Обычно этоmkcert -CAROOTC:\Users\user\AppData\Local\mkcert. - В WSL экспортируйте этот путь в
~/.bashrcили~/.zshrc:echo "export CAROOT=/mnt/c/Users/user/AppData/Local/mkcert" >> ~/.bashrc source ~/.bashrc - Теперь в WSL можно генерировать сертификаты, и они будут доверены в Windows.
Генерация сертификатов: одна строка вместо OpenSSL
После установки доверия остаётся только выпустить сертификат. mkcert делает это одной командой:
mkcert localhost 127.0.0.1 ::1
В результате получаем два файла:
localhost+2.pem— сертификат.localhost+2-key.pem— приватный ключ.
Срок действия сертификата — до августа 2027 года. Этого хватает, чтобы не вспоминать про обновление каждый год.
Wildcard и поддомены: не нужно генерировать сертификаты для каждого сайта
Wildcard-сертификаты (*.example.com) экономят время при тестировании поддоменов:
mkcert example.com "*.example.com" app.local
Сгенерированный сертификат будет валиден для:
example.com*.example.com(например,api.example.com,dashboard.example.com)app.local
Но помните: wildcard-сертификаты работают только на одном уровне поддоменов. Например, сертификат для *.example.com не покроет a.b.example.com.
Явное указание путей: для Docker, CI/CD и автоматизации
Если вы используете Docker или CI/CD, укажите пути к файлам явно:
mkcert -cert-file=/etc/nginx/ssl/fullchain.crt -key-file=/etc/nginx/ssl/key.pem example.com
Это полезно, когда у вас есть скрипт, который автоматически генерирует сертификаты и передаёт их в Nginx, Apache или другой сервер.
Где mkcert ломается (и что с этим делать)
Firefox на Windows: ручной импорт
mkcert не добавляет корневой сертификат CA в Firefox на Windows. Придётся импортировать его вручную:
- Откройте Firefox.
- Перейдите в
Настройки→Сертификаты→Просмотреть сертификаты. - Перейдите на вкладку
Центры сертификации. - Нажмите
Импортироватьи выберитеrootCA.pemиз директории mkcert. - Установите флажок
Доверять этому центру сертификации для идентификации веб-сайтов. - Перезапустите браузер.
Это единственный ручной шаг, который нужно сделать для Firefox.
Мобильные устройства: AirDrop и ручная установка
Для iOS и Android корневой сертификат (rootCA.pem) нужно установить вручную:
- Сгенерируйте сертификат на компьютере.
- Передайте
rootCA.pemна устройство (через AirDrop, email, HTTP-сервер). - На устройстве откройте файл и установите сертификат.
- Включите доверие к нему в настройках безопасности.
Это неудобно, поэтому mkcert — инструмент для локальной разработки, а не для продакшен-сред.
Node.js: чтобы HTTPS работал не только в браузере
Node.js не использует системное хранилище сертификатов. Поэтому нужно явно указать путь к корневому сертификату:
export NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"
node server.js
Без этого браузеры будут доверять сертификатам, а Node.js — нет.
Что mkcert точно не заменит
mkcert создан для локальной разработки. Не используйте его в продакшене:
- Не делитесь приватным ключом локального CA (
rootCA-key.pem). Утечка этого ключа позволит любому выпустить доверенные сертификаты для любых доменов на вашей машине. - Используйте Let’s Encrypt для продакшен-сред. Он бесплатный, автоматический и работает для публичных доменов.
- Для внутренних сетей и корпоративных доменов используйте корпоративные CA (например, Active Directory Certificate Services).
Если попробовать применить mkcert в продакшене, вы получите:
- Отсутствие автоматического продления сертификатов.
- Проблемы с доверием для пользователей, не установивших ваш локальный CA.
- Риск утечки приватного ключа CA.
Итог: mkcert как необходимое зло (которое перестаёт быть злом)
mkcert — не идеальный инструмент. Он требует ручного импорта для Firefox на Windows, не работает на мобильных устройствах без дополнительных шагов, и его нельзя использовать в продакшене. Но он решает реальную проблему: локальная разработка с HTTPS должна быть простой, а не набором костылей.
mkcert делает эту задачу тривиальной: одна команда на установку доверия, одна команда на генерацию сертификата, и зелёный замочек работает без предупреждений. Он не изобретает новые протоколы и не обходит систему безопасности — он использует существующую модель доверия так, как она и должна работать.
Установите mkcert, сгенерируйте сертификат — и забудьте про зелёные замочки, которые не хотят работать.