Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >为GRPC证书加入双向证书认证如此简单

为GRPC证书加入双向证书认证如此简单

作者头像
小锟哥哥
发布于 2022-05-10 00:27:29
发布于 2022-05-10 00:27:29
1.8K00
代码可运行
举报
文章被收录于专栏:GoLang全栈GoLang全栈
运行总次数:0
代码可运行

上一篇文章我们讲解了怎么给 GRPC 配置添加单向证书认证,这一篇我接着分享,如何让 GRPC 服务加入双向证书认证。

双向的证书认证,相比单向的证书认证,使用的地方更多些。

因为客户端和服务端各自都自己的证书,相对来说会更安全。

生成相关证书

我们依旧使用 openSSL 来自签证书,下面下依次生成证书的步骤记录。

这里我的证书全部采用 pem 的格式,和单向的证书不一样。

1、生成私钥

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
openssl genrsa -out ca.key 2048

2、生成 pem证书

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
openssl req -new -x509 -days 3650 -key ca.key -out ca.pem -subj "/CN=go.kun.com"

/CN 我这里随便输入一个域名 go.kun.com 反正需要改 hosts 来模拟被 DNS 解析

这里可以根据你的需要进行修改。

3、签发服务端证书

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
openssl genrsa -out server.key 2048

openssl req -new -key server.key -out server.csr -subj "/CN=go.kun.com" \
-reqexts SAN \
-config <(cat /etc/pki/tls/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:*.kun.com,DNS:*.henjinet.com"))

# 注意
openssl x509 -req -days 3650 \
-in server.csr -out server.pem \
-CA ca.pem -CAkey ca.key -CAcreateserial \
-extensions SAN \
-extfile <(cat /etc/pki/tls/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:*.kun.com,DNS:*.henjinet.com"))

这里我们需要传入 CA 证书的根证书和私钥进行来签发下一级证书。

4、签发客户端证书

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
openssl genrsa -out client.key 2048

openssl req -new -key client.key -out client.csr -subj "/CN=go.kun.com" \
-reqexts SAN \
-config <(cat /etc/pki/tls/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:*.kun.com,DNS:*.henjinet.com"))

# 注意
openssl x509 -req -days 3650 \
-in client.csr -out client.pem \
-CA ca.pem -CAkey ca.key -CAcreateserial \
-extensions SAN \
-extfile <(cat /etc/pki/tls/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:*.kun.com,DNS:*.henjinet.com"))

我们需要用的文件分别是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ca.crt  ca.key  server.crt  server.key

我们把这四个文件放到工程下面的 certs 文件夹下面。

服务端代码

证书生成完毕现在开始去调整我们的代码部分。

首先来调整服务端的代码,调整如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
 "crypto/tls"
 "crypto/x509"
 "google.golang.org/grpc"
 "google.golang.org/grpc/credentials"
 "io/ioutil"
 "k_grpc/pbFiles"
 "k_grpc/services"
 "log"
 "net"
)

func main() {

 cert, _ := tls.LoadX509KeyPair("certs/server.pem","certs/server.key")
 certPool := x509.NewCertPool()
 ca,_ := ioutil.ReadFile("certs/ca.pem")
 certPool.AppendCertsFromPEM(ca)

 cred := credentials.NewTLS(&tls.Config{
  Certificates: []tls.Certificate{cert},
  ClientAuth: tls.RequireAndVerifyClientCert,
  ClientCAs: certPool,
 })

 // 创建一个GRPC服务
 srv := grpc.NewServer(grpc.Creds(cred))
 // 注册需要挂载的服务
 pbFiles.RegisterStudentServiceServer(srv, services.NewStudentService())
 // 启一个监听服务
 lis,_ := net.Listen("tcp",":8080")
 // 启动 GRPC 服务
 if err := srv.Serve(lis);err != nil{
  log.Fatalln(err)
 }
}

这里我们使用 go 里面的 tls 库来加载一个证书池,再把证书池挂载到 GRPC 的服务上面。

这就是大致的思路。

客户端代码

下面来调整客户端的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
 "context"
 "crypto/tls"
 "crypto/x509"
 "fmt"
 "google.golang.org/grpc"
 "google.golang.org/grpc/credentials"
 "io/ioutil"
 "k_grpc/pbFiles"
 "log"
)

func main() {

 cert, err := tls.LoadX509KeyPair("certs/client.pem","certs/client.key")
 if err != nil{
  log.Fatalln(err)
 }
 certPool := x509.NewCertPool()
 ca,err := ioutil.ReadFile("certs/ca.pem")
 if err != nil{
  log.Fatalln(err)
 }
 certPool.AppendCertsFromPEM(ca)

 cred := credentials.NewTLS(&tls.Config{
  Certificates: []tls.Certificate{cert},
  ServerName: "go.kun.com",
  RootCAs: certPool,
 })

 // 创建连接
 client,err := grpc.Dial(":8080",grpc.WithTransportCredentials(cred))
 if err != nil {
  log.Fatalln(err)
 }

 // 定义请求体
 req := &pbFiles.GetStudentRequest{
  SId: 3333,
 }
 // 定义返回体
 rsv := &pbFiles.GetStudentResponse{}

 // 正式请求
 err = client.Invoke(
  context.Background(),
  "/StudentService/GetStudent",
  req,
  rsv)
 if err != nil {
  log.Fatalln(err)
 }
 // 打印输出
 fmt.Println(rsv.Result)
}

和服务端的基本一致,使用 go 里面的 tls 库来加载一个证书池。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GoLang全栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
快速为GRPC服务加入单向证书验证,原来是这么操作的...
为了安全,你可以去购买收费的证书或者免费证书也行,这里演示我们使用 OpenSSL 自生成的证书。
小锟哥哥
2022/05/10
8040
快速为GRPC服务加入单向证书验证,原来是这么操作的...
gRPC,爆赞
gRPC 这项技术真是太棒了,接口约束严格,性能还高,在 k8s 和很多微服务框架中都有应用。
AlwaysBeta
2021/10/12
1.2K0
grpc-go基于双向认证安全通信
grpc-go本身已经支持安全通信,该文是举例介绍下双向认证的安全通信,客户端和服务端是如何实现的。
DifficultWork
2019/05/09
3.8K0
grpc-go之基本使用(一)
gRPC 是一个高性能、通用的开源 RPC 框架,其由 Google 主要面向移动应用开发并基于 HTTP/2 协议标准而设计,基于 ProtoBuf(Protocol Buffers) 序列化协议开发,且支持众多开发语言。
Johns
2022/09/26
1.5K0
go: grpc tls 应用一览
在go 1.15以上版本,必须使用SAN方式,否则会报"transport: authentication handshake failed: x509: certificate relies on legacy Common Name field, use SANs instead"
超级大猪
2023/01/31
1.3K0
​​【gRPC】来聊一聊gRPC认证
gRPC 是一个典型的C/S模型,需要开发客户端 和 服务端,客户端与服务端需要达成协议,使用某一个确认的传输协议来传输数据,gRPC通常默认是使用protobuf来作为传输协议,当然也是可以使用其他自定义的。
阿兵云原生
2023/02/16
1.3K0
Golang(十一)TLS 相关知识(二)OpenSSL 生成证书
0. 前言 接前一篇文章,上篇文章我们介绍了数字签名、数字证书等基本概念和原理 本篇我们尝试自己生成证书 参考文献:TLS完全指南(二):OpenSSL操作指南 1. OpenSSL 简介 OpenSSL 是一个开源项目,其组成主要包括三个组件: openssl:多用途的命令行工具 libcrypto:加密算法库 libssl:加密模块应用库,实现了ssl及tls OpenSSL 主要用于秘钥证书管理、对称加密和非对称加密 1.1 指令 常用指令包括:genrsa、req、x509 1.1.1 genrs
西凉风雷
2022/11/23
2.3K0
openssl 证书生成
golang 1.15+版本上,用 gRPC通过TLS实现数据传输加密时,会报错证书的问题
ruochen
2021/12/06
1.7K0
kubernetes 设置CA双向数字证书认证
Kubernetes 系统提供了三种认证方式:CA 认证、Token 认证 和 Base 认证。 CA 双向认证方式是最为严格和安全的集群安全配置方式,也是我们今天要介绍的主角。
机械视角
2019/10/23
2.9K0
openssl生成cer证书_tls证书生成
wget http://www.openssl.org/source/openssl-1.0.0a.tar.gz
全栈程序员站长
2022/11/04
2.8K0
kubernetes v1.11 二进制部署(二)之Openssl自签TLS证书
节点kubelet的公钥与私钥:是通过boostrap响应的方式,在启动kubelet自动会产生, 然后在master通过csr请求,就会产生。 那么知道这些基本概念之后,下面就开始创建证书的步骤说明。 再次之前可以先看看生成之后的结果图:
Devops海洋的渔夫
2019/05/31
1.2K0
tokio_rustls 自签名证书
服务端使用自己的域名向 CA(Certificate Authority,证书颁发机构)申请证书。
谛听
2021/11/13
2.8K0
Go和HTTPS -2
F为签名函数。CA自己的私钥是唯一标识CA签名的,因此CA用于生成数字证书的签名函数一定要以自己的私钥作为一个输入参数。在RSA加密 系统中,发送端的解密函数就是一个以私钥作 为参数的函数,因此常常被用作签名函数使用。签名算法是与证书一并发送给接收 端的,比如apple的一个服务的证书中关于签名算法的描述是“带 RSA 加密的 SHA-256 ( 1.2.840.113549.1.1.11 )”。因此CA用私钥解密函数作为F,对C的摘要进行运算得到了客户数字证书的签名,好比大学毕业证上的校长签名,所有毕业证
李海彬
2018/03/23
1.3K0
linux下生成openssl证书
下载安装openssl,进入/bin/下面,执行命令(把ssl目录下的openssl.cnf 拷贝到bin目录下) 1.首先要生成服务器端的私钥(key文件): openssl genrsa -des3 -out server.key 1024 [root@airwaySSL openssl]# cd ssl/ [root@airwaySSL ssl]# pwd /home/openssl/ssl [root@airwaySSL ssl]# ls certs  man  misc  openssl.cnf  private  server.csr  server.key 运行时会提示输入密码,此密码用于加密key文件(参数des3便是指加密算法,当然也可以选用其他你认为安全的算法.),以后每当需读取此文件(通过openssl提供的命令或API)都需输入口令.如果觉得不方便,也可以去除这个口令,但一定要采取其他的保护措施! 去除key文件口令的命令: openssl rsa -in server.key -out server.key 2.openssl req -new -key server.key -out server.csr -config openssl.cnf [root@airwaySSL bin]# openssl req -new -key server.key -out server.csr -config openssl.cnf Enter pass phrase for server.key:12345 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:CN State or Province Name (full name) [Some-State]:china Locality Name (eg, city) []:wuhan Organization Name (eg, company) [Internet Widgits Pty Ltd]:airway Organizational Unit Name (eg, section) []:airway Common Name (eg, YOUR name) []:airway Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: 生成Certificate Signing Request(CSR),生成的csr文件交给CA签名后形成服务端自己的证书.屏幕上将有提示,依照其指示一步一步输入要求的个人信息即可. 3.对客户端也作同样的命令生成key及csr文件: openssl genrsa -des3 -out client.key 1024 Generating RSA private key, 1024 bit long modulus ...........++++++ ..++++++ e is 65537 (0x10001) Enter pass phrase for client.key:12345 Verifying - Enter pass phrase for client.key:12345 openssl req -new -key client.key -out client.csr -config openssl.cnf [root@airwaySSL bin]# openssl req -new -key client.key -out client.csr -config openssl.cnf Enter pass phrase for client.key:1234
DevinGeng
2019/04/09
3.3K0
SSL/TLS 双向认证(一) — SSL/TLS 工作原理
本文部分参考: https://www.wosign.com/faq/faq2016-0309-03.htm https://www.wosign.com/faq/faq2016-0309-04.htm http://blog.csdn.net/hherima/article/details/52469674
全栈程序员站长
2022/09/03
10.2K0
SSL/TLS 双向认证(一) — SSL/TLS 工作原理
SSL与TLS协议原理与证书签名多种生成方式实践指南
原文地址: SSL与TLS协议原理与证书签名多种生成方式实践指南 (https://mp.weixin.qq.com/s/g-X8UPNwIkuR_Qd2MDvVQw)
全栈工程师修炼指南
2022/09/29
1.7K0
SSL与TLS协议原理与证书签名多种生成方式实践指南
附008.Kubernetes TLS证书介绍及创建
Kubernetes系统的各个组件需要使用TLS证书对其通信加密以及授权认证,建议在部署之前先生成相关的TLS证书。
木二
2019/07/08
1.5K0
“证书”那些事
本文介绍了如何创建自己的证书颁发机构以及如何创建由该证书颁发机构签名的SSL证书。 尽管有许多文章讨论如何创建自己的SSL证书,但在大多数情况下,它们描述了如何创建自签名证书。这比较简单,但是无法验证或跟踪那些证书。 我个人更喜欢先创建个人证书颁发机构(CA),然后再从该证书颁发机构颁发证书。这种方法的主要优点是,你可以将CA的证书导入浏览器或手机中,并且当你访问自己的网站或连接到SMTP/IMAP服务器时,不会再收到任何警告。现在被认为是值得信赖的。如果你为自己的项目创建证书层次结构,并且希望成为唯一可以为用户颁发证书的人员,则这也是必要的。
tunsuy
2022/10/27
4890
Akka-CQRS(13)- SSL/TLS for gRPC and HTTPS:自签名证书产生和使用
到现在,我们已经完成了POS平台和前端的网络集成。不过,还是那句话:平台系统的网络安全是至关重要的。前一篇博客里我们尝试实现了gRPC ssl/tls网络连接,但测试时用的证书如何产生始终没有搞清楚。现在akka-http开发的ws同样面临HTTPS的设置和使用问题。所以,特别抽出这篇博文讨论一下数字证书的问题。
用户1150956
2019/06/24
1.6K0
OpenSSL - 利用OpenSSL自签证书和CA颁发证书
秘钥操作 这个命令会生成一个1024/2048位的密钥,包含私钥和公钥。 openssl genrsa -out private.key 1024/2038                     (with out password protected)    openssl genrsa -des3 -out private.key 1024/2048    (password protected) 这个命令可以利用private.key文件生成公钥。 openssl rsa -in private.k
Aichen
2018/05/18
6.8K0
相关推荐
快速为GRPC服务加入单向证书验证,原来是这么操作的...
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验