Go 语言通过 net/http 包原生支持 HTTPS 和 HTTP/2,只需提供合法 TLS 证书与私钥,调用 http.ListenAndServeTLS 即可启动安全服务;开发可用自签名证书,生产推荐 Let’s Encrypt;需注意证书格式、路径权限、端口配置及重定向设置。
Go 语言内置的 net/http 包原生支持 HTTPS,只需提供合法的 TLS 证书和私钥文件,就能快速启动安全的 HTTP/2 服务。关键在于证书加载正确、端口使用 443(或开发时用 8443)、并避免明文 HTTP 混合暴露。
HTTPS 必须有 X.509 格式的证书(.crt 或 .pem)与对应私钥(.key)。生产环境建议使用 Let’s Encrypt 签发的免费证书;本地开发可自签名:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/CN=localhost"
cert.pem 包含完整证书链(如含中间证书,需合并到同一文件)调用 http.ListenAndServeTLS,传入监听地址、证书路径和私钥路径:
package mainimport ( "log" "net/http" )
func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Write([]byte("Hello over HTTPS!")) })
log.Println("HTTPS server starting on :8443") log.Fatal(http.ListenAndServeTLS(":8443", "cert.pem", "key.pem", nil))}
注意:
- 地址不能省略端口(如":8443"),否则默认为 443,需 root 权限;
- 若证书不匹配域名或格式错误,启动会直接 panic 并报错;
- 第四个参数为http.Handler,传nil表示使用默认的http.DefaultServeMux。启用 HTTP/2 和强制 HTTPS 重定向
Go 1.8+ 默认启用 HTTP/2(只要证书有效、客户端支持),无需额外配置。但常见需求是将 HTTP 请求自动跳转到 HTTPS:
go func() {
log.Println("HTTP redirect server starting on :80")
log.Fatal(http.ListenAndServe(":80", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
target := "https://" + r.Host + r.URL.Path
if len(r.URL.RawQuery) > 0 {
target += "?" + r.URL.RawQuery
}
http.Redirect(w, r, target, http.StatusMovedPermanently)
})))
}()若需精细控制 TLS 行为(例如禁用 TLS 1.0、指定加密算法),应使用 http.Server 结合 tls.Config:
srv:= &http.Server{ Addr: ":8443", Handler: http.DefaultServeMux, TLSConfig: &tls.Config{ MinVersion: tls.VersionTLS12, CurvePreferences: []tls.CurveID{tls.CurveP256, tls.X25519}, // 可选:设置 SessionTicketsDisabled 或 ClientAuth }, }
log.Println("HTTPS server with custom TLS config starting...") log.Fatal(srv.ListenAndServeTLS("cert.pem", "key.pem"))
注意:
- TLSConfig 中的 Certificates 字段通常不用手动设置(ListenAndServeTLS 内部已加载);
- 修改 MinVersion 或 CipherSuites 前,建议用 SSL Labs 测试工具 验证兼容性。
不复杂但容易忽略:证书路径必须是运行时可读的绝对或相对路径;开发中常因文件权限、路径拼写或证书过期导致启动失败。建议首次运行前用 openssl x509 -in cert.pem -text -noout 检查证书有效性。