Моя цель - обслуживать простую конечную точку 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, действительно ли я могу обслуживать что-то с локального хоста, используя добавленный сертификат без предупреждения «Это соединение не является частным» в моем локальном браузере, и что мне нужно изменить в своем коде, чтобы добиться этого, если это возможно?