0

我的目标是在本地和生产中提供一个简单的 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 提供某些内容,而不会在我的本地浏览器中出现“此连接不是私有”警告,如果是,我需要在代码中进行哪些更改才能实现这一点可能的?

4

0 回答 0