Использование Autocert в Go и добавление самозаверяющего сертификата для локального обслуживания https - PullRequest
0 голосов
/ 18 февраля 2020

Моя цель - обслуживать простую конечную точку https как локально, так и в производстве. Я обнаружил пакет autocert , который, я полагаю, я могу использовать в производстве с помощью let encrypt. Я нашел gss c для локального запуска сервера https с самозаверяющими сертификатами. Наконец, Как доверять дополнительным сертификатам CA в вашем Go приложении выглядит полезным. Я взял идеи из всех этих источников и попытался использовать их вместе, хотя я не уверен, что все они необходимы.

Насколько я понимаю, я могу использовать AppendCertsFromPEM для добавьте самозаверяющий сертификат к другому сертификату, и это позволит клиентам перестать жаловаться при локальной загрузке. Также, по-видимому, с помощью autocert мне даже не нужно самостоятельно создавать файлы сертификатов на моей локальной машине.

Когда я посещаю https://localhost:443, я все еще получаю следующую ошибку:

2020/02/18 14:38:42 http: Ошибка квитирования TLS от [:: 1]: 51832: EOF

Чтобы добавить самозаверяющий сертификат, я скачал один общедоступный сертификат из здесь , а затем добавил свой к этому. Это правильный подход или мне нужен другой откуда-то еще (я не могу найти его в своей локальной системе).

Вот мой код:

// Router.
r := mux.NewRouter()
r.HandleFunc("/", Handler)

// Autocert.
m := &autocert.Manager{
    Prompt:     autocert.AcceptTOS,
    HostPolicy: autocert.HostWhitelist("localhost"), // Will change when I go to prod
    Cache:      autocert.DirCache("."), // Where certs are stored
}

// Default server config.
server := &http.Server{
    Handler:   r,
    Addr:      ":https",
    TLSConfig: &tls.Config{GetCertificate: m.GetCertificate}, // Default for prod.
}

// If dev, overwrite TLSConfig with new values (appended cert). 
if os.Getenv("APP_ENV") == "dev" {
    // Get the SystemCertPool, continue with an empty pool on error
    rootCAs := x509.NewCertPool()
    certs, _ := ioutil.ReadFile("./cert_downloaded_from_mozilla.crt")
    _ = rootCAs.AppendCertsFromPEM(certs)

    xsert := gssc.GetCertificate("localhost")

    server.TLSConfig = &tls.Config{
        InsecureSkipVerify: true,
        RootCAs:            rootCAs,
        ServerName:         "localhost",
        GetCertificate:     xsert,
    }

    server.TLSConfig.BuildNameToCertificate() // Do I even need to call this?
}

panic(server.ListenAndServeTLS("", ""))

Я имею прочитайте, что мне не нужно ничего предоставлять server.ListenAndServeTLS, потому что мы используем autocert, но затем у меня возникла ошибка, так как не удалось открыть файл.

В основном, без изменений DNS и т. д. c, действительно ли я могу обслуживать что-то с локального хоста, используя добавленный сертификат без предупреждения «Это соединение не является частным» в моем локальном браузере, и что мне нужно изменить в своем коде, чтобы добиться этого, если это возможно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...