iris不直接管理证书,必须通过go标准库http.server层传入tls.config或使用listentls("cert.pem","key.pem")启动https;证书需pem格式、私钥无密码,不支持pfx或系统证书存储,也不提供自动续期。

Iris 不直接管理证书文件,必须靠 Go 标准库的 http.Server 层传入 tls.Config 或直接提供证书路径 —— 这意味着你不能像 IIS 那样“导入证书到系统存储”,也不能在 Iris 的路由配置里填个证书路径就完事。
用 app.ListenTLS 启动 HTTPS 服务(最简方式)
这是 Iris 提供的快捷封装,底层调用 http.ListenAndServeTLS。它要求你手头有 PEM 格式的证书和私钥文件(cert.pem 和 key.pem),不是 PFX。
- 证书必须是 PEM 编码,不能是 DER、P7B 或 PFX;如果只有 PFX,得先用 OpenSSL 转换:
openssl pkcs12 -in cert.pfx -clcerts -nokeys -out cert.pem和openssl pkcs12 -in cert.pfx -nocerts -nodes -out key.pem - 私钥不能带密码保护,否则
ListenTLS会 panic;若已有加密私钥,需先解密:openssl rsa -in key-encrypted.pem -out key.pem - 调用示例:
app.ListenTLS(":443", "cert.pem", "key.pem")—— 注意端口不能是:80或未加s的Listen - 该方式不支持 SNI 多域名切换,所有请求都用同一对证书响应
手动构造 http.Server 并传入 tls.Config(支持 SNI 和高级控制)
当你需要一个 IP 绑定多个域名、或想复用证书缓存、或要禁用弱协议时,必须绕过 ListenTLS,自己建 http.Server 实例。
- 先读取证书链(含中间 CA)和私钥:
tls.LoadX509KeyPair("fullchain.pem", "privkey.pem")—— 注意不是只读 leaf 证书,fullchain.pem应包含站点证书 + 中间证书(顺序:leaf → intermediate) - 构建
tls.Config时建议显式设置:MinVersion: tls.VersionTLS12,并禁用Renegotiation - SNI 支持靠
GetCertificate回调实现,例如用certmagic.CertMagic自动管理 Let’s Encrypt 证书,或手动 map 域名到*tls.Certificate - Iris 实例需通过
app.Build()获取底层*http.ServeMux,再交给自定义http.Server管理,不能直接调app.Run
常见错误:浏览器报 “NET::ERR_CERT_AUTHORITY_INVALID”
这不是 Iris 的错,而是证书链没配全或域名不匹配。排查重点不在框架层。
- 用
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com检查返回的Verify return code;非 0 表示链路断裂 - 确认
cert.pem文件里是否只有一段-----BEGIN CERTIFICATE-----—— 如果漏了中间证书,Chrome 会拒绝信任 - 检查证书
Subject Alternative Name (SAN)是否包含你访问的实际域名(如www.example.com和example.com需同时存在) - Iris 不做 HTTP → HTTPS 自动跳转,如果你监听了
:80和:443两个端口,得自己写中间件拦截非 TLS 请求并 301 重定向
真正容易被忽略的是证书生命周期管理 —— Iris 本身不提供自动续期能力,也不集成 ACME 客户端。一旦用 ListenTLS 启动,证书过期后服务会静默失败(连接直接断开,无日志提示),必须配合外部工具(如 Certbot 或 CertMagic)监听文件变化并热重载 http.Server.TLSConfig。











