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

20

我正在阅读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

上述网站要求我连接三个我没有的.pem文件。顺便问一下,为什么需要连接.pem文件?使用未经修改的上述文件,如何在golang web服务器上设置https?

5个回答

26

使用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", "full-cert.crt", "private-key.key", nil)
log.Fatal(err)

使用Go需要一个证书文件(包含一个或多个证书,以您的证书开头)和一个私钥文件(包含一个私钥)。

这不是真正的Go问题,但中间证书是必需的,因为计算机只存储根证书。 通过将它们串联在一起放入一个文件中,您可以让浏览器获得所有证书-这是一个必要的步骤,否则您的服务器可能会在某些设备上失败。 您的证书提供商将提供执行此操作的说明。

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

要组合证书,您可以使用cat(确保它们首先在文件末尾具有换行符),类似于:

cat example.com.ca-crt example.com.ca-bundle > example.com.crt

我不确定为什么那只猫的命令在我这里不起作用,但是我用文本编辑器手动合并它们后现在它可以正常工作了。谢谢! - DTechnlogy
cat 命令无法正常工作的最常见原因是第一个文件末尾缺少换行符。 - Kenny Grant

5
您需要使用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

是的,但如果我没记错,server.crt不是必须通过将文件串联在一起来创建吗?不过我可能记错了。 - irregular
如果我理解正确,这些是发行者证书。包括这些证书并创建捆绑包是很好的,因为浏览器(以前版本的Firefox)如果没有访问完整链路,将不接受您的正确证书。您可以从Chrome浏览器开始调试所有内容。然后将所有证书合并到一个捆绑包中,并随之部署。 - Eugene Lisitsky

1
这是我的发现,我想分享一下,因为所有可用的安装指南都是针对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")

希望它有所帮助!

0

这个库 https://github.com/adrianosela/sslmgr 抽象了密钥和证书的整个概念。所有你需要做的就是让服务器可通过主机名访问(即你的 DNS 必须将 yourdomain.com 指向你的公共 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()

-1
如果您正在使用Go语言的gin库,那么请使用以下代码替换:r.run。
这里有两个参数:
1. server.pem = 您的SSL中间根CA证书。 2. server.key = 您的SSL密钥文件。:8080 = 您的监听端口。
请使用以下代码:
r.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key")。

这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - mbuechmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接