Go 语言通过 net/http 包原生支持 HTTPS 和 HTTP/2,只需提供合法 TLS 证书与私钥,调用 http.ListenAndServeTLS 即可启动安全服务;开发可用自签名证书,生产推荐 Let’s Encrypt;需注意证书格式、路径权限、端口配置及重定向设置。

Go 语言内置的 net/http 包原生支持 HTTPS,只需提供合法的 TLS 证书和私钥文件,就能快速启动安全的 HTTP/2 服务。关键在于证书加载正确、端口使用 443(或开发时用 8443)、并避免明文 HTTP 混合暴露。
准备有效的 TLS 证书和私钥
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包含完整证书链(如含中间证书,需合并到同一文件) - 私钥文件必须是 PEM 格式且无密码保护(Go 不支持带密码的私钥自动解密)
启动 HTTPS 服务:使用 http.ListenAndServeTLS
调用 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))}
立即学习“go语言免费学习笔记(深入)”;
注意:
- 地址不能省略端口(如":8443"),否则默认为 443,需 root 权限;
- 若证书不匹配域名或格式错误,启动会直接 panic 并报错;
- 第四个参数为http.Handler,传nil表示使用默认的http.DefaultServeMux。启用 HTTP/2 和强制 HTTPS 重定向
Go 1.8+ 默认启用 HTTP/2(只要证书有效、客户端支持),无需额外配置。但常见需求是将 HTTP 请求自动跳转到 HTTPS:
- 另启一个 HTTP 服务监听 80 端口,返回 301 重定向:
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)
})))
}()- 生产部署时,也可用反向代理(如 Nginx)统一处理 TLS 终止和重定向,Go 后端跑纯 HTTP
进阶:自定义 TLS 配置(如限制协议版本或加密套件)
若需精细控制 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 检查证书有效性。










