TLS证书认证

什么是TLS
传输层
TLS的作用

TLS协议主要解决如下三个网络安全问题。

  • 保密(message privacy),保密通过加密encryption实现,所有信息都加密传输,第三方无法嗅探;
  • 完整性(message integrity),通过MAC校验机制,一旦被篡改,通信双方会立刻发现;
  • 认证(mutual authentication),双方认证,双方都可以配备证书,防止身份被冒充;

Win版自签证书网址测试使用

自签证书配置

进入bin目录

1、执行openssl
2、执行genrsa -des3 -out server.key 2048(会生成server.key,私钥文件)

3、创建证书请求:req -new -key server.key -out server.csr (会生成serve.csr)其中common name也就是域名:我填的是xgrpc.com

4、删除密码rsa -in server.key -out server_no_passwd.key

5、执行x509 -req -days 365 -in server.csr -signkey server_no_passwd.key -out server.crt(会生成server.crt)

自此自签证书完成

服务端构建TLS证书

func main(){
    //构造TLS凭证
	creds,err := credentials.NewServerTLSFromFile("keys\server.crt","keys\server_no_passwd.key")
	if err != nil {
		log.Fatal(err)
	}
    // 新建gRPC服务器实例,并开启TLS认证
	grpcServer := grpc.NewServer(grpc.Creds(creds))
	....
}

客户端配置TLS连接

没有配置证书之前使用 //grpc.WithInsecure()设置禁止安全验证传输

服务端配置证书之后客户端再次访问报错:rpc error: code = Unavailable desc = connection closed

func main()  {
    //证书验证
	creds,err := credentials.NewClientTLSFromFile("keys\server.crt","xgrpc.com")
	if err != nil {
		log.Fatal(err)
	}
    conn,err := grpc.Dial(Address,grpc.WithTransportCredentials(creds))
	....	
}
GODEBUG=x509ignoreCN=0

否则报错

rpc error: code = Unavailable desc = connection error: desc = "transport: authentication handshake failed: x509: certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0"