Beego启动HTTPS必须通过配置驱动,禁用http.ListenAndServeTLS;需在app.conf或代码中设置EnableHTTPS=true、HTTPSCertFile和HTTPSKeyFile,且证书链、私钥格式(PKCS#1)、文件权限(0600)、换行符(LF)及SAN字段缺一不可。

Beego 启动 HTTPS 必须用配置驱动,不能套用 http.ListenAndServeTLS
Beego v2.x 不接受手动传入证书启动 TLS,硬塞 http.ListenAndServeTLS(":443", "cert.pem", "key.pem", beego.BeeApp) 会编译失败或 panic——因为 *beego.App 不实现 http.Handler 接口。它只认自己的配置项和 adapter.Run() 流程。
正确路径是通过 adapter.BConfig.Listen 显式开启并指定证书路径,框架内部自动调用 ListenAndServeTLS。若你看到 tls: failed to find any PEM data 或服务直接退出,八成是跳过了这层配置,误用了标准库函数。
HTTPSCertFile 和 HTTPSKeyFile 的格式要求很具体
证书文件不是“有内容就行”,必须满足三个硬性条件:
-
HTTPSCertFile必须是完整证书链 PEM(含服务器证书 + 中间 CA),不能只放cert.pem;Let’s Encrypt 用户必须用fullchain.pem,否则浏览器报NET::ERR_CERT_AUTHORITY_INVALID -
HTTPSKeyFile必须是 PKCS#1 格式 RSA 私钥,以-----BEGIN RSA PRIVATE KEY-----开头;OpenSSL 3.0+ 默认生成的 PKCS#8(-----BEGIN PRIVATE KEY-----)在旧版 Beego 中会解析失败,报failed to parse key PEM data - 私钥不能加密:如果生成时用了
-aes256,必须先解密:openssl rsa -in key.pem.enc -out key.pem;Beego 不提示“密钥被加密”,只会卡在 TLS handshake 阶段
端口冲突、重定向与权限问题最容易被忽略
同时启用 HTTP 和 HTTPS 时,常见现象是 HTTPS 启动失败但日志只显示 ListenAndServeTLS: ... 没有具体错误。真实原因往往藏在这些地方:
- Linux/macOS 下私钥文件权限必须是
0600,chmod 600 key.pem缺一不可;0644会被 Go 底层crypto/tls静默拒绝 - 证书路径要用相对路径(如
"./server.crt")或绝对路径;放在和可执行文件同级目录最稳妥,别依赖app.conf所在目录 - 若 HTTP 和 HTTPS 端口都设为
443或80,会因地址复用冲突;建议 HTTPS 用443,HTTP 用8080,再配HTTPToHTTPS = true自动跳转 - Windows 换行符(CRLF)会导致 PEM 解析失败,用
dos2unix cert.pem key.pem清理
自签名证书调试要加 subjectAltName 才能过 Chrome 90+
开发时用 openssl req 生成自签名证书,如果没显式指定 SAN(Subject Alternative Name),Chrome 90+ 会直接拒绝连接,报 ERR_CERT_COMMON_NAME_INVALID,哪怕 CN 是 localhost 也没用。
正确命令是:
openssl req -x509 -newkey rsa:4096 -nodes -keyout key.pem -out cert.pem -days 365 -subj "/CN=localhost" -addext "subjectAltName = DNS:localhost,IP:127.0.0.1"
注意:-addext 参数仅在 OpenSSL 1.1.1+ 支持;旧版本需用配置文件方式。不加这一行,本地调试就永远连不上。


















