如何在golang Web服务器上设置HTTPS?

时间:2017-10-28 16:35:20

标签: go https

我正在阅读https://www.kaihag.com/https-and-go/并从Comodo购买了SSL证书,他们通过电子邮件向我发送了.zip个文件。到目前为止,我所有的文件都是这样的

csr.pem
private-key.pem
website.com.crt
website.com.ca-bundle
website.com.zip

上面的网站要我连接我没有的3 .pem个文件。顺便提一下,.pem文件需要连接的原因是什么?使用上面尚未修改的文件,如何在golang网络服务器上设置https?

4 个答案:

答案 0 :(得分:8)

使用https://golang.org/pkg/net/http/#ListenAndServeTLS

http.HandleFunc("/", handler)
log.Printf("About to listen on 10443. Go to https://127.0.0.1:10443/")
err := http.ListenAndServeTLS(":10443", "cert.pem", "key.pem", nil)
log.Fatal(err)

这不是一个真正的问题,但中间证书是必需的,因为计算机只存储根证书。通过连接它们,您将它们全部放在一个文件中,以便浏览器获得所有证书 - 这是必需的步骤,否则您的服务器将在某些设备上失败。您的证书提供商将提供执行此操作的说明。对于go,您需要一个证书文件和一个私钥文件。

https://kb.wisc.edu/page.php?id=18923

以下是comodo组合证书的一些说明(与使用哪个服务器无关,流程相同):

https://support.comodo.com/index.php?/Knowledgebase/Article/View/1091/37/certificate-installation--nginx

答案 1 :(得分:1)

您需要http.ListenAndServeTLS

package main

import (
    // "fmt"
    // "io"
    "net/http"
    "log"
)

func HelloServer(w http.ResponseWriter, req *http.Request) {
    w.Header().Set("Content-Type", "text/plain")
    w.Write([]byte("This is an example server.\n"))
    // fmt.Fprintf(w, "This is an example server.\n")
    // io.WriteString(w, "This is an example server.\n")
}

func main() {
http.HandleFunc("/hello", HelloServer)
    err := http.ListenAndServeTLS(":443", "server.crt", "server.key", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

这是一个片段:https://gist.github.com/denji/12b3a568f092ab951456

答案 2 :(得分:0)

https://github.com/adrianosela/sslmgr抽象了密钥和证书的整个概念。您所需要做的就是使主机名可以访问服务器(即您的DNS必须将yourdomain.com指向your-public-ip)。您甚至可以为本地开发禁用SSL,如下所示:

ss, err := sslmgr.NewServer(sslmgr.ServerConfig{
    Hostnames: []string{os.Getenv("yourdomain.com")},
    Handler:   h,
    ServeSSLFunc: func() bool {
        return strings.ToLower(os.Getenv("PROD")) == "true"
    },
})
if err != nil {
    log.Fatal(err)
}
ss.ListenAndServe()

答案 3 :(得分:0)

这是我的发现,我想分享一下,因为我花了几个小时,因为所有可用的安装指南都是针对Nginx和Apache HTTP配置的,而不是针对Golang Web服务器的。

环境:

  • Comodo / Sectigo的SSL证书
  • Gin-gonic作为中间件

问题:

  • 在Mac上的Chrome / Firefox上运行正常,但在Windows Firefox上却出现了CORS错误。后来,发现这与CORS无关,我使用https://www.digicert.com/help诊断了我的ubuntu服务器的SSL有效性。结果是,“证书未由受信任的机构签名(与Mozilla的根存储进行检查)”。

解决方案:

解决方案是使用文本编辑器连接以下证书,并根据需要命名。我将其保存为“ my_domain.txt”。

  • my_domain.ca-bundle(其中包括一个根和两个中间证书)
  • my_domain.crt(我的域的主要证书)

然后像这样运行它,

router.RunTLS(":"+os.Getenv("PORT"), "../my_domain.txt", "../my_private_key.txt")

希望它有所帮助!