RunTLS启动HTTPS必须传fullchain.pem和privkey.pem两个PEM文件,证书需含完整链,私钥权限须为0600,路径建议用filepath.Abs转绝对路径,开发用:8443、上线切:443;HTTP跳转需另起独立HTTP服务做301重定向。

RunTLS 启动 HTTPS 服务必须传两个 PEM 文件
直接调用 r.RunTLS() 是最简路径,但它硬性要求两个非空、可读的 PEM 文件:证书(如 fullchain.pem)和私钥(如 privkey.pem)。缺一不可,也不能是 PFX、DER 或带密码的私钥。
- 证书文件必须包含完整链:域名证书 + 所有中间 CA,否则浏览器报
NET::ERR_CERT_AUTHORITY_INVALID - 私钥文件权限必须为
0600(Linux/macOS),0644会触发误导性错误tls: private key does not match public key - 路径建议用
filepath.Abs()转成绝对路径,避免工作目录不一致导致open cert.pem: no such file or directory - 开发调试请用
":8443",正式上线再切":443";后者需 root 权限,否则启动失败
HTTP → HTTPS 301 跳转必须起独立服务
Gin 没有内置重定向中间件,r.Use() 对 HTTP 请求完全无效——HTTPS 服务根本收不到 HTTP 请求。必须额外启一个纯 HTTP 服务,只做 301 跳转。
- 监听
":80"(或开发用":8080"),Handler 中用http.Redirect(w, r, redirectURL, http.StatusMovedPermanently) -
redirectURL构造要严谨:Scheme 改为https,Host 不变,Path 和 Query 全部透传,不能硬编码域名 - 必须用 goroutine 异步启动该 HTTP 服务,否则阻塞主流程;且不能和 HTTPS 共享同一个
http.Server实例 - 若部署在 Nginx / ALB / CLB 后,此跳转应由前置代理完成,Gin 层无需重复实现
生产环境推荐手动构造 http.Server
r.RunTLS() 封装简单,但无法配置超时、TLS 版本、密码套件等关键参数。生产环境必须自己 new http.Server 并调 srv.ListenAndServeTLS()。
-
TLSConfig.MinVersion至少设为tls.VersionTLS12,禁用 TLS 1.0/1.1 - 务必设置
ReadTimeout、WriteTimeout、IdleTimeout,防止连接耗尽 - 证书加载建议提前调
tls.LoadX509KeyPair()校验,失败立即 panic,别等到 ListenAndServeTLS 时才暴露 - 不要同时调
r.Run()和srv.ListenAndServeTLS(),端口冲突会导致 panic
证书更新必须重启进程
Gin 和 Go 标准库都不支持证书热更新。哪怕你用 certmagic 或自研 reload 逻辑,底层 http.Server 的 TLSConfig 一旦启动就不可变。
立即学习“go语言免费学习笔记(深入)”;
这意味着每次证书续期(比如 Let’s Encrypt 自动更新),都必须触发服务重启。K8s 场景下可通过 liveness probe 配合 rolling update 实现无缝切换;裸机部署则需配合 systemd 或 supervisor 管理进程生命周期。别指望 reload 信号或文件监听能绕过这个限制。


















