grpc ssl。 python 服务端, go 客户端。

go grpc
python grpc

证书 私钥准备

生成(根)私钥和公钥

openssl req -x509 -nodes -newkey rsa:4096 -keyout ca.key -out ca.pem -subj /O=me

  • ca.key is a private key
  • ca.pem is a public certificate
服务端

openssl req -nodes -newkey rsa:4096 -keyout server.key -out server.csr -subj /CN=whatever -days 36500 && openssl x509 -req -in server.csr -CA ca.pem -CAkey ca.key -days 36500 -set_serial 1 -out server.pem -extfile <(echo "subjectAltName=DNS:myServerName")
注意 DNS:myServerName, myServerName 在 客户端连接时指定使用

  • server.key is the server’s private key.
  • server.csr is an intermediate file.
  • server.pem is the server’s public certificate.
客户端

openssl req -nodes -newkey rsa:4096 -days 36500 -subj /CN=marketplace -keyout client.key -out client.csr && openssl x509 -req -in client.csr -CA ca.pem -CAkey ca.key -days 36500 -set_serial 1 -out client.pem

  • client.key
  • client.pem

###代码

服务端(py)
def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    recommendations_pb2_grpc.add_RecommendationsServicer_to_server(
        RecommendationService(), server
    )

    with open("server.key", "rb") as fp:
        server_key = fp.read()
    with open("server.pem", "rb") as fp:
        server_cert = fp.read()
    with open("ca.pem", "r") as fp:
        SslCaPem = fp.read()
    creds = grpc.ssl_server_credentials(
    	[(server_key, server_cert)], #  加密
    	root_certificates=bytes(SslCaPem.encode()),  # 认证
        require_client_auth=True,  # 认证
   	)  
    server.add_secure_port("[::]:443", creds)
    server.start()
    server.wait_for_termination()
客户端(go)
	clientPem := "clientPemStr"
	clientKey := "clientKeyStr"
	caPem := "caPemStr"  # 根证书
    // tls.Config中的 ServerName用到生成服务端公钥时指定的
    certificates, err := tls.X509KeyPair([]byte(clientPem), []byte(clientKey))
	if err != nil {
	    log.D().Errorf("failed to load clientPem clientKey",)
	}
	certPool := x509.NewCertPool()
	if !certPool.AppendCertsFromPEM([]byte(caPem)) {
		log.D().Error("failed to append CA certificate")
	}
	tlsConfig := &tls.Config{
		RootCAs:    certPool, // 认证服务端使用
		ServerName: "myServerName", // 验证对方的(如有变动 需重新生成服务端证书 SAN中的 dns 一起更改)
		Certificates: []tls.Certificate{certificates},  // 客户端证书
	}
	creds := credentials.NewTLS(tlsConfig)
	addr := fmt.Sprintf("%s:%d", ip, conf.Default().Grpc.ServerPort)

	conn, err := grpc.Dial(
		addr,
		grpc.WithTransportCredentials(creds),
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的Python代码示例,演示如何使用gRPC实现客户端服务端的多进程并发执行: 服务端代码: ```python import grpc from concurrent import futures import time import hello_pb2 import hello_pb2_grpc class HelloService(hello_pb2_grpc.HelloServicer): def sayHello(self, request, context): print("Received message: ", request.message) return hello_pb2.HelloReply(message="Hello, %s!" % request.message) def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) hello_pb2_grpc.add_HelloServicer_to_server(HelloService(), server) server.add_insecure_port("[::]:50051") server.start() print("Server started at [::]:50051") while True: time.sleep(86400) if __name__ == '__main__': serve() ``` 客户端代码: ```python import grpc import hello_pb2 import hello_pb2_grpc from concurrent import futures import multiprocessing def run_client(): channel = grpc.insecure_channel("localhost:50051") stub = hello_pb2_grpc.HelloStub(channel) response = stub.sayHello(hello_pb2.HelloRequest(message="world")) print("Response received from server: ", response.message) if __name__ == '__main__': pool = multiprocessing.Pool(processes=4) for i in range(4): pool.apply_async(run_client) pool.close() pool.join() ``` 在上面的示例中,服务端使用了Python的concurrent.futures模块创建了一个线程池,用于处理客户端请求,同时使用了Python的multiprocessing模块创建了多个子进程,同时向服务端发起请求客户端通过调用multiprocessing.Pool()方法创建进程池,并使用apply_async()方法异步调用run_client()方法,实现了多个客户端同时向服务端发起请求的并发执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值