iris 启动 https 需手动提供有效 pem 格式证书和未加密私钥,路径相对于 main.go;http 跳转需另启服务;生产推荐 nginx 反代处理 tls 与 let’s encrypt 续期。

直接用 app.Listen 启动 HTTPS 服务就行,但必须提供证书文件路径
Iris 本身不内置证书生成或自动续期能力,它只负责加载你给的 .crt 和 .key 文件并传给 Go 标准库的 http.Server。所以关键不是“Iris 怎么开 HTTPS”,而是“你怎么把有效的证书文件准备好,并正确喂给 app.Listen”。
常见错误现象:listen tcp :443: bind: permission denied(没用 root 或管理员权限跑 443 端口)、open /path/to/cert.crt: no such file(路径写错或没上传)、浏览器提示“NET::ERR_CERT_INVALID”(证书域名不匹配或过期)。
-
app.Listen第二个参数必须是iris.TLS("cert.crt", "key.key"),不能只传端口字符串 - 证书路径是相对于
main.go所在目录的相对路径,不是相对于项目根目录或 GOPATH - Go 进程需要有读取私钥文件的权限;Windows 上若用非管理员身份运行,建议改用 8443 端口测试
腾讯云/天翼云免费证书怎么导出成 Iris 能用的 PEM 格式
腾讯云、天翼云等平台下载的证书包默认含 .pem + .key(TrustAsia),或 .pfx(IIS 专用)。Iris 只认 PEM 格式的证书链和 RSA 私钥——也就是纯文本开头为 -----BEGIN CERTIFICATE----- 和 -----BEGIN RSA PRIVATE KEY----- 的文件。
如果你拿到的是 .pfx(比如从阿里云或 IIS 导出的),必须先转换:
openssl pkcs12 -in your-domain.pfx -clcerts -nokeys -out cert.pem openssl pkcs12 -in your-domain.pfx -nocerts -nodes -out key.pem
执行后会提示输入 PFX 密码;输出的 key.pem 可能包含 -----BEGIN ENCRYPTED PRIVATE KEY-----,需再解密一次:
openssl rsa -in key.pem -out key-unencrypted.pem
- 最终给
iris.TLS用的必须是未加密的私钥(即不带ENCRYPTED字样,且无密码保护) - 证书文件
cert.pem必须包含完整证书链(server cert + intermediate CA),否则某些客户端会校验失败 - 别用在线 PEM 转换网站——私钥一旦上传就等于泄露
HTTPS 配置生效后,HTTP 自动跳转要自己加中间件
Iris 不像 Nginx 那样内置 return 301 https://$host$request_uri,HTTP 和 HTTPS 是两个完全独立的监听实例。想实现“访问 http:// 自动跳到 https://”,得手动启动两个 server,或用反向代理前置处理。
最轻量的做法是:在同一个进程里同时监听 80 和 443,80 端口只做 301 跳转:
app := iris.New()
// HTTPS 主服务
go func() {
app.Listen(":443", iris.TLS("cert.pem", "key.pem"))
}()
// HTTP 跳转服务(仅响应 301)
redirectApp := iris.New()
redirectApp.Get("/{any:path}", func(ctx iris.Context) {
host := ctx.Request().Host
if strings.Contains(host, ":80") {
host = strings.TrimSuffix(host, ":80")
}
ctx.Redirect("https://" + host + ctx.Request().RequestURI, 301)
})
redirectApp.Listen(":80")
- 注意:Linux 下绑定 80/443 需要
sudo权限,开发时可先用:8080和:8443测试逻辑 - 不要在 HTTPS server 里用
ctx.Redirect回 HTTP——这会破坏加密通道,也违背安全原则 - 如果部署在云服务器上,确保安全组已放行 443(和 80,如果要用跳转)端口
Let’s Encrypt 免费证书怎么和 Iris 配合用
Let’s Encrypt 证书有效期只有 90 天,手动更新不现实。Iris 没有内置 ACME 客户端,但你可以用 certbot 或 acme.sh 在服务器上自动续期,然后让 Iris 监听证书文件变化并热重载——不过 Iris 目前不支持运行时重载 TLS 证书。
更稳妥的方案是:用 Nginx 做反向代理,由 Nginx 处理 HTTPS 终结和证书自动续期,Iris 只跑在本地 127.0.0.1:8080 的 HTTP 服务上:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
- 这是生产环境最推荐的方式:Nginx 负责 TLS、HTTP/2、OCSP Stapling、证书续期;Iris 专注业务逻辑
- 如果你坚持 Iris 直连 HTTPS,就得写脚本监听
/etc/letsencrypt目录变更,然后 kill + restart 进程——注意连接中断问题 - 别在
go run main.go开发模式下折腾 Let’s Encrypt,域名验证阶段无法通过本地回环地址完成
openssl rsa -check -in key.pem 先确认。











