mkcert

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

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

Наиболее простым и, возможно, самым известным решением является 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

Итог