Golang实现RPC安全通信需在net/rpc或gRPC上叠加TLS:服务端用tls.Listen配置证书与mTLS,客户端用tls.Dial并校验证书;推荐gRPC因其原生HTTP/2支持、丰富生态及细粒度TLS控制。

使用 Golang 实现 RPC 安全通信,核心是把 TLS 套在标准的 net/rpc 或更现代的 gRPC 之上。Go 原生支持 TLS,不需要第三方库,关键在于正确配置服务器和客户端的证书、密钥与验证逻辑。
用 net/rpc + TLS 实现基础安全 RPC
net/rpc 本身不处理传输层加密,但可以运行在 TLS 封装的 net.Listener 和 net.Conn 上。你需要:
- 生成自签名或 CA 签发的证书(如用
openssl或cfssl); - 服务端用
tls.Listen替代net.Listen,传入*tls.Config; - 客户端用
tls.Dial建立连接,并设置tls.Config.InsecureSkipVerify = false(生产环境必须校验证书); - 把 TLS 连接传给
rpc.NewClient(注意:需包装为符合io.ReadWriteCloser的对象)。
示例片段(服务端):
srv := rpc.NewServer()ln, _ := tls.Listen("tcp", ":8080", &tls.Config{
Certificates: []tls.Certificate{cert},
ClientAuth: tls.RequireAndVerifyClientCert,
ClientCAs: caPool,
})
http.Serve(ln, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
srv.ServeHTTP(w, r)
}))
启用双向 TLS 认证(mTLS)
仅服务端有证书不够安全,mTLS 要求客户端也提供有效证书并被服务端信任。这是 RPC 身份强认证的关键:
立即学习“go语言免费学习笔记(深入)”;
- 服务端
tls.Config.ClientAuth设为tls.RequireAndVerifyClientCert; - 服务端
ClientCAs字段加载可信 CA 证书池(用于验签客户端证书); - 客户端调用
tls.Dial时,通过Config.Certificates提供自己的证书链,Config.RootCAs加载服务端 CA; - 可在
tls.Config.VerifyPeerCertificate中添加自定义校验逻辑(例如检查 CN 或 SAN 是否匹配预期服务名)。
迁移到 gRPC(推荐用于新项目)
net/rpc 功能简单,但缺乏流控、超时、拦截器等企业级能力。gRPC 天然基于 HTTP/2,TLS 支持更成熟:
- 服务端用
grpc.Creds(credentials.NewTLS(tlsConfig))创建监听凭证; - 客户端同样用
credentials.NewTLS构建连接凭证; - 可配合
grpc.WithTransportCredentials和grpc.Dial安全连接; - 支持更细粒度控制:如禁用 TLS 1.0/1.1、指定密码套件、启用 ALPN 协商等。
好处是生态丰富——可轻松集成 JWT 拦截器、OpenTelemetry、Zap 日志等。
证书管理与部署建议
TLS 安全不只靠代码,更依赖证书生命周期管理:
- 避免硬编码证书路径,改用环境变量或配置中心注入证书内容(如 PEM 字符串);
- 证书过期前自动轮换,可借助 cert-manager(K8s)或 HashiCorp Vault;
- 开发阶段可用
mkcert快速生成本地可信证书,避免浏览器/客户端报错; - 生产环境务必关闭
InsecureSkipVerify,且验证证书域名(SNI)与实际访问地址一致。
基本上就这些。TLS 不复杂但容易忽略细节,尤其是证书信任链和双向认证逻辑。写完记得用 openssl s_client -connect host:port -servername host 手动测通,再跑 RPC 调用验证端到端加密生效。










