gRpc中的TLS验证

gRpc中默认支持两种授权,SSL/TLS认证方式、基于Token的认证方式

1.1 SSL/TLS认证方式

SSL全称是Secure Sockets Layer,又被称之为安全套接字层,是一种标准安全协议,用于在通信过程中建立客户端与服务器之间的加密连接。
TLS的全称是Transport Layer Security,TLS是SSL的升级版本。在使用额过程中,往往习惯于将SSL和TLS组合在一起,统称为SSL/TLS。
简而言之,SSL/TLS是一种用于网络通信中加密的安全协议。

1.2 SSL/TLS工作原理

使用SSL/TLS协议对通信连接进行安全加密,是通过非对称加密的方式来实现的。所谓非对称加密方式又称之为公钥加密,密钥由公钥和私钥两种密钥组成。私钥和公钥成对存在,先生成私钥,再通过私钥生成对应的公钥。公钥可以公开,私钥需要保密。

加密过程
1.客户端想要想服务器发起连接,首先向服务器端请求要加密的公钥
2.客户端获取到服务器签发的公钥后,使用公钥将信息进行加密。
3.服务端接受到加密信息,使用私钥对信息进行解密并进行其他操作,完成整个信道加密并实现数据传输的过程。

1.3 制作证书

安装openssl并生成相应的证书

openssl ecparam -genkey -name secp384r1 -out server.key  //生成私钥
openssl req -new -x509 -sha256 -key server.key -out server.pem -days 3650 // 根据私钥生成公钥

注意生成公钥的时候填写自己网址的Common Name,如下图:

gRpc中的TLS验证_第1张图片

这里的go-grpc-example后面会用到。

server:

type areaManager struct {
}

func(a *areaManager) GetArea(ctx context.Context, req *area.AreaRequest) (*area.AreaResponse,error){
	width := req.Width
	height := req.Height
	resp := new(area.AreaResponse)
	resp.Area = width * height
	return resp, nil
}

func main() {
	creds, err := credentials.NewServerTLSFromFile("./keys/server.pem",
		"keys/server.key") # 这里的server.key和server.pem就是刚才生成的公钥和私钥
	s := grpc.NewServer(grpc.Creds(creds))
	area.RegisterAreaServiceServer(s, new(areaManager))
	lis, err := net.Listen("tcp", ":8089")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}
	fmt.Println("server listen at 8089")
	err = s.Serve(lis)
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}

}

client:

func main() {
	creds, err := credentials.NewClientTLSFromFile("keys/server.pem", "go-grpc-example")  #这里的第二个参数就是生成公钥时输入的common name
	if err != nil {
		log.Fatalf("Failed to create TLS credentials %v", err)
	}
	conn, err := grpc.Dial(":8089", grpc.WithTransportCredentials(creds))
	if err != nil {
		log.Fatalf("connect to server failed: %v", err)
	}
	defer conn.Close()
	client := area.NewAreaServiceClient(conn)
    res, err := client.GetArea(context.Background(), &area.AreaRequest{Width:10, Height:10})
    if err != nil {
    	log.Fatalln(err.Error())
	}
    print(res.Area)

}

你可能感兴趣的:(Golang)