gRPC的服务器可能部署在 Internet 云端,那么客户机与服务器之间的明文通信存在安全隐患,gRPC提供了SSL/TLS方式对传输的数据进行加密是必要的。
下面用实例代码呈现这个过程:
准备工作
事先准备好 root,private, 以及chain证书。 把 private.pem 与 chain.pem 拷贝到服务器。证书可以采用OpenSSL自签名来生成(请自行百度),或者到网上证书机构申请CA证书。
gRPC 客户端
import grpc
import helloworld_pb2
with open('roots.pem', 'rb') as f:
creds = grpc.ssl_channel_credentials(f.read())
channel = grpc.secure_channel('myservice.example.com:443', creds)
stub = helloworld_pb2.GreeterStub(channel)
说明:
ssl_channel_credentials(f.read())
方法是生成客户端加密credential, 其第1个参数要求是root_certificates。- .
secure_channel('myservice.example.com:443', creds)
生成gRPC客户端, - stub = helloworld_pb2.GreeterStub(channel) 生成接口层stub,后面是通过这个stub来调用各个接口。
gRPC 服务器端
import grpc
import helloworld_pb2
from concurrent import futures
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
with open('key.pem', 'rb') as f:
private_key = f.read()
with open('chain.pem', 'rb') as f:
certificate_chain = f.read()
server_credentials = grpc.ssl_server_credentials( ( (private_key, certificate_chain), ) )
# 将接口服务注册到gRPC服务器
greet_service.add_GreetingServicer_to_server(GreetingService(), server)
server.add_secure_port('myservice.example.com:443', server_credentials)
server.start()
说明
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
创建gRPC服务器server_credentials = grpc.ssl_server_credentials( ( (private_key, certificate_chain), ) )
生成服务器端的 SSL credential , 其第1个参数必须是 private_key_certificate_chain_pairs.server.add_secure_port('myservice.example.com:443', server_credentials)
配置SSL到443端口。
至此,为gRPC 添加基本的SSL功能就完成了。