• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

go语言gRPC系列(二) - 为gRPC添加证书

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

1. 前言

前情回顾

go语言gRPC系列(一) - gRPC入门

之前我们演示的客户端和服务端之间是没有使用证书的,不是很安全。下面演示一下,服务调用之间加入自签的证书验证。

生产环境以网上购买的证书为准

2. 生成自签证书

2.1 MAC生成自签证书的教程链接:

https://www.jianshu.com/p/4cdd29ce424d

2.2 Windows生成自签证书的教程

  1. 登录如下链接

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

  1. 下载如下的openssl工具

  1. 安装到某个目录
  2. 进入安装目录的bin文件夹下
  3. 在所在的文件夹打开cmd,并输入openssl

  1. 然后再执行如下的操作, 生成私钥文件
  • 会生成一个server.key
genrsa -des3 -out server.key 2048

  1. 创建证书请求
  • 会生成一个server.csr
genrsa -des3 -out server.key 2048

  1. 为了演示简单,删除私钥中的密码
  • 会生成一个server_no_password.key
rsa -in server.key -out server_no_password.key

  1. 生成公钥文件
  • 会生成server.crt
x509 -req -days 365 -in server.csr -signkey server_no_password.key -out server.crt


3. 改造服务端使用自签证书

3.1 复制证书至代码下

在服务端的目录下新建一个keys文件夹,并且上之前生成的server_no_password.keyserver.crt复制到目录下

3.2 改造代码添加证书认证

改造之前上一节的服务端代码,具体改造的部分如下标红的部分

完整的服务端代码:

package main

import (
	"gomicro-quickstart/grpc_server/service"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
	"log"
	"net"
)

func main() {
// 1. 引用证书
tls, err := credentials.NewServerTLSFromFile("grpc_server/keys/server.crt", "grpc_server/keys/server_no_password.key")
if err != nil {
	log.Fatal("服务端获取证书失败: ", err)
}

// 2. new一个grpc的server,并且加入证书
rpcServer := grpc.NewServer(grpc.Creds(tls))

// 3. 将刚刚我们新建的ProdService注册进去
service.RegisterProdServiceServer(rpcServer, new(service.ProdService))

// 4. 新建一个listener,以tcp方式监听8082端口
listener, err := net.Listen("tcp", ":8082")
if err != nil {
	log.Fatal("服务监听端口失败", err)
}

// 5. 运行rpcServer,传入listener
_ = rpcServer.Serve(listener)
}

3.1 运行代码并查看客户端的访问错误

运行server服务端

这时候我们同样运行起来client,发现会报如下的错,因为我们的服务端使用证书加密了

4. 改造客户端代码(单向认证)

4.1 复制公钥给客户端

这里为了刚入门演示方便,采用了单向认证。

  1. 在客户端代码下新建keys文件夹
  2. 将server.crt复制到keys文件夹下

4.2 改造客户端代码

较上一章的代码的改动如下图:

完整的客户端代码如下:

package main

import (
	"context"
	"fmt"
	"gomicro-quickstart/grpc_client/service"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
	"log"
)

func main() {
	// 1. 添加公钥证书的引用, codepie.fun是之前生成证书的时候填写的common name
	tls, err := credentials.NewClientTLSFromFile("grpc_client/keys/server.crt", "codepie.fun")

	if err != nil {
		log.Fatal("客户端获取证书失败: ", err)
	}

	// 2. 新建连接,端口是服务端开放的8082端口
	conn, err := grpc.Dial(":8082", grpc.WithTransportCredentials(tls))
	if err != nil {
		log.Fatal(err)
	}

	// 退出时关闭链接
	defer conn.Close()

	// 3. 调用Product.pb.go中的NewProdServiceClient方法
	productServiceClient := service.NewProdServiceClient(conn)

	// 4. 直接像调用本地方法一样调用GetProductStock方法
	resp, err := productServiceClient.GetProductStock(context.Background(), &service.ProductRequest{ProdId: 233})
	if err != nil {
		log.Fatal("调用gRPC方法错误: ", err)
	}

	fmt.Println("调用gRPC方法成功,ProdStock = ", resp.ProdStock)
}

4.3 运行客户端查看结果

单向认证成功,服务调用成功


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
关于goget无法安装国内被墙软件解决办法发布时间:2022-07-10
下一篇:
go学习发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap