您现在的位置是:首页 >其他 >gRPC对于的TLS实现网站首页其他

gRPC对于的TLS实现

Krien666 2023-07-09 08:00:03
简介gRPC对于的TLS实现

1.首先通过openssl生成证书和私钥

https://slproweb.com/products/Win32OpenSSL.html

2.配置环境变量

3.命令行测试 openssl

4. 生成证书

1. 生成私钥
openssl genrsa -out server.key 2048

2.生成证书 全部回车即可,可以不填
openssl req -new -x509 -key server.key -out server.crt -days 36500

3.生成 csr
openssl req -new -key server.key -out server.csr

会在你的目录下生成三个文件


5. 更改openssl.cfg

1. 复制一份你安装的openssl的bin目录里的openssl.cfg文件到你项目所在的目录
2. 找到 [ CA_default ] 打开copy_extensions = copy
3. 找到 [ req ] 打开 req_extensions = v3_req
4. 找到 [ v3_req ] 添加 subjectAltName = @alt_names
5. 添加新的标签和标签字段 DNS.1 = *.krien.com

6.

1. 生成证书私钥test.key
openssl genpkey -algorithm RSA -out test.key

2.通过私钥test.key生成证书请求文件test.csr
openssl req -new -nodes -key test.key -out test.csr -days 3650 -subj "/C=cn/OU=myorg/O=mycomp/CN=myname" -config ./openssl.cfg -extensions v3_req

3.生成SAN证书  pem
openssl x509 -req -days 365 -in test.csr -out test.pem -CA server.crt -CAkey server.key -CAcreateserial -extfile ./openssl.cfg -extensions v3_req

7.服务端代码

类型定义:NewServerTLSFromFile里面有两个参数。certFilekeyFilecertFile就是我们生成的pem后缀的证书文件,第二个是私钥,储存在服务器端,非常安全。

func NewServerTLSFromFile(certFile, keyFile string) (TransportCredentials, error)

创建的时候再把 creds 丢到 grpcServer := grpc.NewServer(grpc.Creds(creds)) 就行了,服务器端就修改好了
完整代码如下:

package main

import (
	"context"
	"fmt"
	pb "gRPC_test/hello-server/proto"

	"net"

	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
)

type server struct {
	pb.UnimplementedSayHelloServer
}

func (s *server) SayHello(ctx context.Context, req *pb.HelloRequests) (*pb.HelloResponse, error) {
	return &pb.HelloResponse{ResponseMsg: "hello" + req.RequestName}, nil
}

func main() {
	// TSL认证
	// 证书签名文件和私钥文件
	creds, _ := credentials.NewServerTLSFromFile("C:\Users\79120\Desktop\GoPro\gRPC_test\key\test.pem", "C:\Users\79120\Desktop\GoPro\gRPC_test\key\test.key")
	// 开启端口
	listen, _ := net.Listen("tcp", ":9090")
	// 创建gRPC服务
	grpcServer := grpc.NewServer(grpc.Creds(creds))
	// 在gRPC服务端中去注册我们编写的服务
	pb.RegisterSayHelloServer(grpcServer, &server{})

	// 启动服务
	err := grpcServer.Serve(listen)
	if err != nil {
		fmt.Printf("failed to serve :%v ", err)
		return
	}

}

8.客户端代码

首先需要在 credentials.NewClientTLSFromFile() 方法里放入两个参数,分别是pem证书文件,和请求域,请求域名和 openssl.cfg 文件里配置的域名一致,不然会报错(真实情景中请求域是从浏览器中获取的)

credentials.NewClientTLSFromFile("C:\Users\79120\Desktop\GoPro\gRPC_test\key\test.pem", "*.krien.com")

完整代码如下:

package main

import (
	"context"
	"fmt"
	"log"

	pb "gRPC/hello-server/proto"

	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
)

func main() {
	creds, _ := credentials.NewClientTLSFromFile("C:\Users\79120\Desktop\GoPro\gRPC_test\key\test.pem", "*.kangstudy.com")

	conn, err := grpc.Dial("127.0.0.1:9090", grpc.WithTransportCredentials(creds))
	if err != nil {
		log.Fatalf("did not connect:%v", err)
	}
	// 所有的连接用完都要关闭连接
	defer conn.Close()

	// 建立连接
	client := pb.NewSayHelloClient(conn)
	// 执行rpc调用(这个方法在服务器端来实现并返回结果)
	resp, _ := client.SayHello(context.Background(), &pb.HelloRequests{RequestName: "krien"})
	fmt.Println(resp.ResponseMsg)
}

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。