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
,如下图:
这里的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)
}