gRPC python 教程(三):接口通信安全

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功能就完成了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python可以使用gRPC实现通信gRPC是一种高性能、开源的远程过程调用(RPC)框架。它使用Protocol Buffers作为接口定义语言(IDL),支持多种编程语言。 要在Python中实现gRPC通信,需要进行以下步骤: 1. 定义服务接口:使用Protocol Buffers定义服务接口,包括请求和响应的消息类型以及服务方法。 2. 生成代码:使用Protocol Buffers编译器将定义的.proto文件生成对应的Python代码。 3. 实现服务逻辑:编写服务实现类,继承自生成的代码中的服务基类,并实现定义的服务方法。 4. 启动服务器:创建gRPC服务器,并将实现的服务添加到服务器中。 5. 创建客户端:创建gRPC客户端,通过客户端调用远程服务方法。 下面是一个简单的示例: 1. 定义服务接口(example.proto): ``` syntax = "proto3"; package example; service Greeter { rpc SayHello (HelloRequest) returns (HelloResponse) {} } message HelloRequest { string name = 1; } message HelloResponse { string message = 1; } ``` 2. 生成代码:使用Protocol Buffers编译器生成Python代码: ``` $ python -m grpc_tools.protoc -I . --python_out=. --grpc_python_out=. example.proto ``` 3. 实现服务逻辑(server.py): ```python import grpc import example_pb2 import example_pb2_grpc class GreeterServicer(example_pb2_grpc.GreeterServicer): def SayHello(self, request, context): message = f"Hello, {request.name}!" return example_pb2.HelloResponse(message=message) def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) example_pb2_grpc.add_GreeterServicer_to_server(GreeterServicer(), server) server.add_insecure_port('[::]:50051') server.start() server.wait_for_termination() if __name__ == '__main__': serve() ``` 4. 启动服务器: ``` $ python server.py ``` 5. 创建客户端(client.py): ```python import grpc import example_pb2 import example_pb2_grpc def run(): channel = grpc.insecure_channel('localhost:50051') stub = example_pb2_grpc.GreeterStub(channel) response = stub.SayHello(example_pb2.HelloRequest(name='Alice')) print("Greeter client received: " + response.message) if __name__ == '__main__': run() ``` 以上是一个简单的Python实现gRPC通信的示例。你可以根据自己的需求定义更复杂的服务接口和实现逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值