Go微服务实战|第9章:gRPC TLS Secure
Synopsis: 为了保证 gRPC 服务端与客户端之间的数据交互的安全性,需要启用 TLS 加密
代码已上传到 https://github.com/wangy8961/grpc-go-tutorial/tree/v0.9 ,欢迎 star
1. 要点
gRPC
默认使用 HTTP2
来传输用 Protocol buffers
编码后的二进制数据,而 HTTP2
协议需要启用 TLS
加密连接。但是,你会发现前面几篇博文中,我们在没有启用 TLS 加密的情况下,也能正常使用 gRPC,是因为在客户端代码中通过 grpc.Dial(*addr, grpc.WithInsecure())
中的 grpc.WithInsecure()
暂时禁止了安全传输功能
1.1 ServerOption
服务端代码在 grpc.NewServer()
中接受 0 个或多个选项参数 grpc.ServerOption
:
我们可以通过 credentials.NewServerTLSFromFile()
来返回 grpc.TransportCredentials
:
也可以通过如下方式获取
grpc.TransportCredentials
:
cert, err := tls.LoadX509KeyPair(*certFile, *keyFile) if err != nil { log.Fatalf("failed to load key pair: %s", err) } creds := credentials.NewServerTLSFromCert(&cert)
然后再将返回值 grpc.TransportCredentials
传入 grpc.Creds()
函数,就可以获取 grpc.ServerOption
(它包含了启用 TLS
连接所需要的参数)
总体代码类似:
creds, err := credentials.NewServerTLSFromFile(certFile, keyFile) if err != nil { log.Fatalf("failed to load certificates: %v", err) } s := grpc.NewServer(grpc.Creds(creds))
说明:
certFile
是服务端的数字证书(已由CA
签名),keyFile
是服务端的私钥
。如果你不明白TLS
加密的原理,请仔细阅读: https://madmalls.com/blog/category/network-security/
1.2 DialOption
客户端代码在 grpc.Dial()
中接受 0 个或多个选项参数 grpc.DialOption
:
我们可以通过 credentials.NewClientTLSFromFile()
来返回 grpc.TransportCredentials
:
func NewClientTLSFromFile(certFile, serverNameOverride string) (TransportCredentials, error) { ... }
然后再将返回值 grpc.TransportCredentials
传入 grpc.WithTransportCredentials()
函数(客户端产生 DialOption
的函数都以 With
字符开头),就可以获取 grpc.DialOption
(它包含了启用 TLS
连接所需要的参数)
总体代码类似:
creds, err := credentials.NewClientTLSFromFile(certFile, "") if err != nil { log.Fatalf("failed to load CA root certificate: %v", err) } // Set up a connection to the server. conn, err := grpc.Dial(*addr, grpc.WithTransportCredentials(creds)) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close()
说明:
certFile
是CA
根证书,用来验证服务端发来的数字证书
。如果你不明白TLS
加密的原理,请仔细阅读: https://madmalls.com/blog/category/network-security/
2. 申请证书
假设已经在 192.168.40.128
上搭建了私有 CA
,具体步骤请参考: https://madmalls.com/blog/post/openssl-howto/#4-ca 。gRPC 的服务端 IP 为 192.168.40.123
,客户端既可以通过此 IP 访问它,也可以通过 www.wangy.com
域名解析访问它,详情可参考: https://madmalls.com/blog/post/migrating-from-http-to-https/#2
现在为 gRPC 服务端申请数字证书:
1 条评论
评论者的用户名
评论时间bz
2021-10-12T16:01:53Zgrpc SSL 动态吊销客户端证书
grpc server 端支持动态导入CRL文件,验证被吊销的客户端证书吗