我的目标是在本地和生产中提供一个简单的 https 端点。我找到了我相信我可以在生产中使用的autocert包,让我们加密。我发现gssc可以使用自签名证书在本地启动 https 服务器。最后,How to trust extra CA certs in your Go App看起来很有用。我从所有这些来源中汲取了想法并尝试将它们一起使用,尽管我不确定是否需要所有这些。
我的理解是,我可以使用AppendCertsFromPEM
将自签名证书附加到另一个证书,这将使客户端在尝试本地加载时不再抱怨。同样显然使用 autocert 我什至不需要自己在本地机器上生成证书文件。
当我访问时,https://localhost:443
我仍然收到以下错误:
2020/02/18 14:38:42 http:来自 [::1]:51832 的 TLS 握手错误: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
因为我们正在使用自动证书,但后来我遇到了一个错误,因为它无法打开文件。
基本上,如果没有 DNS 更改等,我实际上是否能够使用附加证书从 localhost 提供某些内容,而不会在我的本地浏览器中出现“此连接不是私有”警告,如果是,我需要在代码中进行哪些更改才能实现这一点可能的?