您的位置:首页 > 编程语言 > Go语言

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

2020-08-15 01:02 1861 查看
  • 3. 改造服务端使用自签证书
  • 4. 改造客户端代码(单向认证)

    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.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 复制公钥给客户端

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

    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 运行客户端查看结果

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

  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: