mkcert

При разработке в локальном окружении многие пренебрегают имитацией https и запускают свои сервисы по http.

Задача состоит в следующем:

  • Сервить траффик на локальной машине по https с валидным сертификатом;
  • Сделать так, чтобы это легко воспроизводилось не только у вас, но и у всех членов вашей команды.

Наиболее простым и, возможно, самым известным решением является mkcert 1.

На macOS при установке через brew он потянет за собой go, что не очень приятно. Обо всём этом я уже писал в заметке про asdf. Способ установки выберите самостоятельно, я же принял решение воспользоваться go install:

go install filippo.io/mkcert@latest

После установки выполните следующую команду:

mkcert -install

Будет сгенерирован корневой сертификат и создан локальный CA:

mkcert -install
Created a new local CA 💥
Sudo password:
The local CA is now installed in the system trust store! ⚡️
The local CA is now installed in Java's trust store! ☕️

Теперь внимание! Посмотрите на вот эти файлики:

ls "$(mkcert -CAROOT)"

Ими делиться ни с кем нельзя! Просто оставьте их там, где они есть и забудьте о них.

Давайте перейдём к созданию https-сервера. Пусть сервер будет работать на хосте demo.dmz. В заметке про dnsmasq2 мы уже обсуждали создание локальных доменных зон.

Создадим под наш тест-драйв временную папку и начнём в генерации сертификата:

cd $(mktemp -d)
mkcert demo.dmz

Перейдём к созданию простейшего сервера на go, файла main.go нам будет достаточно, поэтому не стоит заморачиваться на создание модуля:

package main

import (
    "log"
    "net/http"
)

func main() {
    sslCertCrtPath, sslCertKeyPath := "demo.dmz.pem", "demo.dmz-key.pem"

    log.Fatalln(
       http.ListenAndServeTLS(
          ":443",
          sslCertCrtPath,
          sslCertKeyPath,
          http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
             _, _ = w.Write([]byte("Hello, HTTPS!"))
          }),
       ),
    )
}

Запускаем:

go run main.go

И проверяем, как на это реагирует браузер:

mkcert

Итог

  • Локальный https настроен;
  • Установка и настройка mkcert выполняется элементарно — её легко воспроизвести на машинах других разработчиков;
  • Для собственной же безопасности не публикуйте ничего, что сгенерировал mkcert.