grpc 开发进阶 - 加密传输

Posted by icebergu on 04-28,2020

现在网上大部分都是 grpc 相关的介绍,真正涉及到 grpc 的配置使用的文章还是比较少的
所以本系列着重介绍 grpc 开发时可以能会用到的一些配置

不使用任何加密

客户端创建连接的时候默认必须使用加密传输,否则会直接报错

2020/04/28 15:59:53 did not connect: grpc: no transport security set (use grpc.WithInsecure() explicitly or set credentials)
exit status 1

禁用安全传输

// client
conn, _ := grpc.Dial("localhost:50051", grpc.WithInsecure())

开启 TLS/SSL 加密

TLS 是一种常见的端对端安全传输协议
grpc 可以使用 credentials.TransportCredentials 结构来方便的开启安全传输

服务端

使用 credentials.NewServerTLSFromFile 生成 credentials.TransportCredentials
调用 grpc.NewServer 时传递 grpc.Creds

creds, err := credentials.NewServerTLSFromFile(certFile, keyFile)
if err != nil {
  log.Fatalf("Failed to generate credentials %v", err)
}

lis, err := net.Listen("tcp", ":0")
server := grpc.NewServer(grpc.Creds(creds))

// ignore Serve error
server.Serve(lis)

客户端

生成 credentials.TransportCredentials

// serverNameOverride 用于测试, 通常为 "" 空字符串
func NewClientTLSFromCert(cp *x509.CertPool, serverNameOverride string) TransportCredentials

func NewClientTLSFromFile(certFile, serverNameOverride string) (TransportCredentials, error)

调用 grpc.Dial 时传递 grpc.WithTransportCredentials

creds, _ := credentials.NewClientTLSFromFile(certFile, "")
conn, _ := grpc.Dial("localhost:50051", grpc.WithTransportCredentials(creds))