go语言gRPC系列(二) - 为gRPC添加证书
2020-08-15 01:02
1861 查看
1. 前言
前情回顾
之前我们演示的客户端和服务端之间是没有使用证书的,不是很安全。下面演示一下,服务调用之间加入自签的证书验证。
生产环境以网上购买的证书为准
2. 生成自签证书
2.1 MAC生成自签证书的教程链接:
2.2 Windows生成自签证书的教程
- 登录如下链接
- 下载如下的openssl工具
- 安装到某个目录
- 进入安装目录的bin文件夹下
- 在所在的文件夹打开cmd,并输入
openssl
- 然后再执行如下的操作, 生成私钥文件
- 会生成一个
server.key
genrsa -des3 -out server.key 2048
- 创建证书请求
- 会生成一个
server.csr
genrsa -des3 -out server.key 2048
- 为了演示简单,删除私钥中的密码
- 会生成一个
server_no_password.key
rsa -in server.key -out server_no_password.key
- 生成公钥文件
- 会生成
server.crt
x509 -req -days 365 -in server.csr -signkey server_no_password.key -out server.crt
3. 改造服务端使用自签证书
3.1 复制证书至代码下
在服务端的目录下新建一个keys文件夹,并且上之前生成的
server_no_password.key和
server.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 复制公钥给客户端
这里为了刚入门演示方便,采用了单向认证。
- 在客户端代码下新建keys文件夹
- 将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 运行客户端查看结果
单向认证成功,服务调用成功
相关文章推荐
- Easyui + asp.net MVC 系列教程 第19-23 节 完成注销 登录限制过滤 添加用户
- 【Xamarin开发 Android 系列 11】 创建一个Json读取数据应用-添加摄像头集成
- SVN系列(一) 添加文件
- Windows AD证书服务系列---证书发布与吊销(3)
- fedora系列 virtualBox 添加 主机网络网卡错误 "failed to open /dev/vboxnetctl"
- SharePoint【Ribbon系列】-- 02.在Ribbon中添加新Tab
- 【office365使用系列】添加自有域名至office365
- Windows AD证书服务系列---证书发布与吊销(4)
- Exchange系列—自签名证书续订
- Android 窗口添加机制系列1-Activity
- 给PATH变量添加路径--用Enki学Linux系列(6)
- Android cer ssl 安全证书 https Android(cacerts.bks)添加根证书
- MFC添加加瓦系列一之MFC水平与垂直布局
- SSL应用系列之二:CA证书颁发机构(中心)安装图文详解
- Easyui + MVC 系列教程 第19-23 节 完成注销 登录限制过滤 添加用户
- ubuntu系统上如何添加新的根证书
- Spring MVC系列:(6)添加用户的小案例
- Exchange Server 2010续定证书系列6-对其它服务器分配服务
- RecyclerView系列之(2):为RecyclerView添加分隔线
- Asp.net MVC]Asp.net MVC5系列——添加视图