必须设GO111MODULE=on、GOPROXY=https://goproxy.cn,direct、GOPATH=$HOME/go;GO111MODULE=on强制启用模块模式避免vendor混乱,GOPROXY解决国内网络下go get超时问题,GOPATH虽在Go 1.16+非强制但旧工具链仍需显式声明。

Go环境安装后必须设的三个环境变量
不设 GOPROXY、GO111MODULE 和 GOPATH,后续 go mod 基本跑不起来。国内网络下尤其要配代理,否则 go get 会卡死或超时。
-
GOPROXY=https://goproxy.cn,direct(推荐)或https://proxy.golang.org,direct -
GO111MODULE=on:强制启用模块模式,避免vendor混乱 -
GOPATH可设为$HOME/go,但 Go 1.16+ 已不强制依赖它;若用旧工具链(如某些 IDE 插件),仍建议显式声明
配置完执行 source ~/.zshrc(macOS)或 source ~/.bashrc(Linux),再运行 go env GOPROXY 验证是否生效。
自签名证书必须填 DNSNames,CommonName 已不够用
Chrome、Firefox 和现代 Go 客户端(如 http.Client)默认忽略 CommonName,只校验 DNSNames 或 IPAddresses 字段。哪怕你只跑 https://localhost,也得在证书模板里明确写上:
DNSNames: []string{"localhost"}- 如果还要支持
https://127.0.0.1,加IPAddresses: []net.IP{net.ParseIP("127.0.0.1")} - 别漏掉
BasicConstraintsValid: true和IsCA: true——否则curl --cacert ca.pem会报 “unable to get local issuer certificate”
常见错误:用 openssl req -new -x509 生成时只输 localhost 当 Common Name,结果浏览器提示 ERR_CERT_COMMON_NAME_INVALID,其实根本没读那个字段。
立即学习“go语言免费学习笔记(深入)”;
私钥格式和文件权限是 ListenAndServeTLS 失败的两大主因
http.ListenAndServeTLS 对输入极其敏感,90% 的 panic 都来自私钥问题:
- 私钥必须是未加密的 PEM 格式,且块类型为
"RSA PRIVATE KEY"(PKCS#1),不是"PRIVATE KEY"(PKCS#8)——后者在旧版 Go 或某些嵌入式 TLS 实现中会解析失败 - 用
openssl rsa -in key.pem -out key_unencrypted.pem去密码;若原始私钥带密码,ListenAndServeTLS直接 panic:tls: failed to find any PEM data in certificate input - 文件权限必须可读:
chmod 600 cert.pem key.pem,否则 Linux/macOS 下报open cert.pem: permission denied,错误信息却不提权限 - 路径别用
./cert.pem——当前工作目录不确定,改用绝对路径或filepath.Abs("cert.pem")
证书和私钥不能合并成一个文件传给 LoadX509KeyPair
tls.LoadX509KeyPair 内部按固定分隔符解析,把 cert 和 key 写进同一个 PEM 文件容易出错。正确做法是分开编码、分别保存:
- 证书 PEM 块类型必须是
"CERTIFICATE"(不是"X509 CERTIFICATE"或其他变体) - 私钥 PEM 块类型用
"RSA PRIVATE KEY",写入前确保是*rsa.PrivateKey类型,不是interface{} - 验证方式:
openssl x509 -in cert.pem -text -noout应能打印出完整字段;openssl rsa -in key.pem -check应返回RSA key ok
最易被忽略的是:生成的证书里 SerialNumber 必须是 *big.Int,直接写 1 会导致 x509: serial number is negative panic ——得用 big.NewInt(1)。


















