必须用 http.ListenAndServeTLS 启动 HTTPS 服务,正确配置 cert.pem(含服务器证书和中间证书)与未加密的 key.pem;客户端应通过 RootCAs 或 VerifyPeerCertificate 安全校验,禁用 InsecureSkipVerify。
如何用 net/http 启动 HTTPS 服务(而非 HTTP)
Go 的 http.Server 本身不区分 HTTP/HTTPS,关键在监听方式:必须用 http.ListenAndServeTLS,不能用 http.ListenAndServe。否则即使配置了证书,也只会走明文 HTTP。
常见错误是把 PEM 文件路径写错、权限不足,或混淆了证书链顺序(cert.pem 必须包含服务器证书 + 中间证书,key.pem 是私钥,且不能加密)。
-
cert.pem中若漏掉中间 CA,浏览器会报x509: certificate signed by unknown authority - 私钥文件若带密码(如用
openssl genrsa -aes256生成),ListenAndServeTLS会直接 panic,需先用openssl rsa -in key.pem.enc -out key.pem去密 - 本地测试可用
generate_cert.go(Go 自带工具)快速生成自签名证书,但客户端需显式跳过验证(仅限开发)
客户端如何安全地调用 HTTPS 接口(绕过证书校验的坑)
默认情况下,http.DefaultClient 会严格校验证书。若服务端用自签名证书或域名不匹配,请求直接失败,报错 x509: certificate is valid for xxx, not yyy。
临时跳过验证的写法很常见,但极易误用于生产:
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{Transport: tr}
这等于完全放弃 TLS 安全性,中间人可篡改全部通信。真正安全的做法是: