HTTPS 必须用 ConfigureHost() + Run(),Listen() 不支持 TLS;iris.TLS() 是最简方式但要求 PEM 格式证书;自定义 TLS 行为需手动 ConfigureHost() 设置 TLSConfig;HTTP 跳转 HTTPS 需双实例或反向代理。

HTTPS 启动必须用 ConfigureHost() + Run(),Listen() 不支持 TLS
Iris 的 Listen() 方法只处理纯 HTTP,传入 "localhost:443" 或加证书路径都会 panic。真正启用 HTTPS 的唯一可靠路径是:先调用 ConfigureHost() 配置底层 *http.Server,再调用 Run() 启动。
常见错误现象:panic: tls: failed to find any PEM data in certificate input 或直接退出无日志——基本都是误用了 Listen() 或证书路径不可读。
-
app.Run(iris.TLS("localhost:443", "cert.pem", "key.pem"))是最简方式,它内部已封装了ConfigureHost()调用,但要求两个文件必须是 PEM 格式、路径可读、权限正确(Linux 下注意 SELinux 或文件权限) - 若需自定义 TLS 行为(如动态证书、ClientAuth、MinVersion 控制),必须手动构造
*http.Server并通过ConfigureHost()注入 -
cert.pem和key.pem不能是 PFX/P12 格式;如果只有cert.pfx,需用openssl pkcs12 -in cert.pfx -clcerts -nokeys -out cert.pem和openssl pkcs12 -in cert.pfx -nocerts -nodes -out key.pem拆解
证书路径和格式错误会导致进程立即 panic,不报详细原因
Iris 在加载证书失败时不会打印具体哪一行出错,只会 panic 并退出。这意味着你无法靠日志定位是文件不存在、权限不足,还是格式不对。
实操建议:
- 启动前先手动检查:
ls -l cert.pem key.pem(Linux/macOS)或dir cert.pem key.pem(Windows),确认文件存在且非空 - 用
file cert.pem确认是 ASCII text(PEM),不是 data;若输出含data,大概率是 DER 或 PFX,需转换 - 在代码里加一层校验(开发期):
if _, err := os.Stat("cert.pem"); os.IsNotExist(err) { panic("cert.pem missing") } - Windows 下特别注意路径分隔符和反斜杠转义——用
filepath.Join("conf", "cert.pem")替代硬写"conf\cert.pem"
需要 TLS 1.2+ 或双向认证?必须用 ConfigureHost() 手动设 TLSConfig
iris.TLS() 只做基础加载,不暴露 *tls.Config 控制权。如果你要禁用 TLS 1.0/1.1、启用 OCSP Stapling、设置 GetCertificate 动态选证,或开启 ClientAuth,只能走手动路径。
示例(强制 TLS 1.2+):
app.ConfigureHost(func(s *http.Server) {
s.TLSConfig = &tls.Config{
MinVersion: tls.VersionTLS12,
// ClientAuth: tls.RequireAndVerifyClientCert, // 如需双向认证
// GetCertificate: yourDynamicCertFunc,
}
})
app.Run(iris.TLS("localhost:443", "cert.pem", "key.pem"))
注意:ConfigureHost() 必须在 Run() 前调用;若重复调用,后一次会覆盖前一次;TLSConfig 中的字段如 MinVersion 不设则走 Go 默认(目前是 TLS 1.2,但未来可能变)。
HTTP 自动跳转 HTTPS 得靠反向代理或中间件,Iris 本身不内置 301 重定向
Iris 没有类似 iris.HTTPSRedirect() 的开箱即用功能。若你只跑单端口(如只开 443),那没问题;但多数生产环境仍需同时监听 80 并 301 跳转到 443。
推荐做法(轻量且可控):
- 启动两个独立
app实例:一个监听:80做跳转,一个监听:443做主服务 - 80 端口 app 只注册一条路由:
app.Get("/{p:path}", func(ctx iris.Context) { ctx.Redirect("https://" + ctx.Host() + ctx.Request().URL.Path, 301) }) - 不要在同一个
app里用iris.WithoutServerError(iris.ErrServerClosed)强行复用端口——HTTP 和 HTTPS 底层协议不兼容,无法共存于同一 listener - 更稳妥的方案是交由 Nginx / Caddy / IIS 反向代理处理跳转,Iris 只专注业务逻辑
容易被忽略的一点:跳转时 ctx.Host() 可能带端口(如 localhost:8080),线上务必用真实域名,或从 X-Forwarded-Host 头提取(需前置代理设置该头)。


















