gRPC---TLS实现

news2024/12/23 6:39:09

文章目录

  • 1.首先通过openssl生成证书和私钥
  • 2.配置环境变量
  • 3.命令行测试 openssl
  • 4. 生成证书
  • 5. 更改openssl.cfg
  • 6.
  • 7.服务端代码
  • 8.客户端代码

1.首先通过openssl生成证书和私钥

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

2.配置环境变量

3.命令行测试 openssl

4. 生成证书

1. 生成私钥
openssl genrsa -out server.key 2048

2.生成证书 全部回车即可,可以不填
openssl req -new -x509 -key server.key -out server.crt -days 36500

3.生成 csr
openssl req -new -key server.key -out server.csr

会在你的目录下生成三个文件


5. 更改openssl.cfg

1. 复制一份你安装的openssl的bin目录里的openssl.cfg文件到你项目所在的目录
2. 找到 [ CA_default ] 打开copy_extensions = copy
3. 找到 [ req ] 打开 req_extensions = v3_req
4. 找到 [ v3_req ] 添加 subjectAltName = @alt_names
5. 添加新的标签和标签字段 DNS.1 = *.krien.com

6.

1. 生成证书私钥test.key
openssl genpkey -algorithm RSA -out test.key

2.通过私钥test.key生成证书请求文件test.csr
openssl req -new -nodes -key test.key -out test.csr -days 3650 -subj "/C=cn/OU=myorg/O=mycomp/CN=myname" -config ./openssl.cfg -extensions v3_req

3.生成SAN证书  pem
openssl x509 -req -days 365 -in test.csr -out test.pem -CA server.crt -CAkey server.key -CAcreateserial -extfile ./openssl.cfg -extensions v3_req

7.服务端代码

类型定义:NewServerTLSFromFile里面有两个参数。certFilekeyFilecertFile就是我们生成的pem后缀的证书文件,第二个是私钥,储存在服务器端,非常安全。

func NewServerTLSFromFile(certFile, keyFile string) (TransportCredentials, error)

创建的时候再把 creds 丢到 grpcServer := grpc.NewServer(grpc.Creds(creds)) 就行了,服务器端就修改好了
完整代码如下:

package main

import (
	"context"
	"fmt"
	pb "gRPC_test/hello-server/proto"

	"net"

	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
)

type server struct {
	pb.UnimplementedSayHelloServer
}

func (s *server) SayHello(ctx context.Context, req *pb.HelloRequests) (*pb.HelloResponse, error) {
	return &pb.HelloResponse{ResponseMsg: "hello" + req.RequestName}, nil
}

func main() {
	// TSL认证
	// 证书签名文件和私钥文件
	creds, _ := credentials.NewServerTLSFromFile("C:\\Users\\79120\\Desktop\\GoPro\\gRPC_test\\key\\test.pem", "C:\\Users\\79120\\Desktop\\GoPro\\gRPC_test\\key\\test.key")
	// 开启端口
	listen, _ := net.Listen("tcp", ":9090")
	// 创建gRPC服务
	grpcServer := grpc.NewServer(grpc.Creds(creds))
	// 在gRPC服务端中去注册我们编写的服务
	pb.RegisterSayHelloServer(grpcServer, &server{})

	// 启动服务
	err := grpcServer.Serve(listen)
	if err != nil {
		fmt.Printf("failed to serve :%v ", err)
		return
	}

}

8.客户端代码

首先需要在 credentials.NewClientTLSFromFile() 方法里放入两个参数,分别是pem证书文件,和请求域,请求域名和 openssl.cfg 文件里配置的域名一致,不然会报错(真实情景中请求域是从浏览器中获取的)

credentials.NewClientTLSFromFile("C:\\Users\\79120\\Desktop\\GoPro\\gRPC_test\\key\\test.pem", "*.krien.com")

完整代码如下:

package main

import (
	"context"
	"fmt"
	"log"

	pb "gRPC/hello-server/proto"

	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
)

func main() {
	creds, _ := credentials.NewClientTLSFromFile("C:\\Users\\79120\\Desktop\\GoPro\\gRPC_test\\key\\test.pem", "*.kangstudy.com")

	conn, err := grpc.Dial("127.0.0.1:9090", grpc.WithTransportCredentials(creds))
	if err != nil {
		log.Fatalf("did not connect:%v", err)
	}
	// 所有的连接用完都要关闭连接
	defer conn.Close()

	// 建立连接
	client := pb.NewSayHelloClient(conn)
	// 执行rpc调用(这个方法在服务器端来实现并返回结果)
	resp, _ := client.SayHello(context.Background(), &pb.HelloRequests{RequestName: "krien"})
	fmt.Println(resp.ResponseMsg)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/466944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UEStudio v2023 Crack应用程序脚本更新

UEStudio v2023 Crack应用程序脚本更新 添加了现代JavaScript支持和完整的浏览器功能。 默认情况下添加了传统的JavaScript支持,以实现完全的向后兼容性。 可对接的Microsoft PowerShell终端 添加了可停靠窗口,可以作为浮动窗口放置在任何位置&#…

java学习之枚举

目录 一、枚举引出 二、分析问题 三、 解决方案-枚举 四、枚举的二种实现方式 五、应用案例 六、小结 一、枚举引出 package enum_;public class Enumeration01 {public static void main(String[] args) {Season spring new Season("春天", "温暖")…

工具链和其他-Web服务器和实例caddy

目录 web服务器介绍 web服务器需要哪些能力?以caddy为例 web server(用户发请求它返回网页) 代理(proxy) 缓存(cache) 日志(logging) API网关(api gatewa…

机器视觉实用工具集NO.18——使用YOLO8实时检测物体,性能爆棚

目录 前言安装YOLO8安装YOLO8的模型程序源代码总结 前言 安装了pytorch框架以后,就可以玩一些开源的深度学习框架了,比如YOLO8,是基于pytorch框架的,关于如何安装pytorch框架,可以参考上篇文章链接《pytorch深度学习框…

我看看哪个靓仔还没把Github Copilot用起来?

本人经常分享有价值的生产力工具、技术、好物与书籍,可关注同名公众🐭并设为🌟星标,第一时间获得更新 Github Copilot 是一个AI编程助手,其使用 OpenAI CodeX 在你的编辑器中实时建议代码或给你实现整个功能。 视频版介…

C++基础 类的自动转换和强制类型转换

参考 C Primer Plus (第6版) 类自动转换 接受一个参数的构造函数允许使用赋值语法将对象初始化一个值 Classname object value; 等价于 ClassName object(value); 等价于 ClassName object ClassName(value); 只有接受一个参数的构造函数才能作为转换构造函数(某类型->…

windows下开发ffmpeg(亲测可用)下载FFmpeg的源码、库、链接文件(二)

1,首先安装opencv在clion下的使用 参见我的另外一篇文章Windows上使用CLion配置OpenCV环境,亲测可用的方法 2,亲测可以用,建议使用迅雷下载ffmpeg(全部的包都有) Windows10 下 CLion 配置 FFmpeg 开发环境 3,参考文章,碰到系统提示缺少.dll库,问题解决 参考文章1:…

HCIA-RS实验-STP和RSTP(1)

这篇文章开始前,先简单说下这2个协议; 本文介绍了STP和RSTP的基本原理、优缺点以及应用场景。STP和RSTP都是生成树协议,主要作用于避免网络中的环路,保证数据包能够正常转发。在实际应用中,需要根据实际情况选择合适的…

6.MapReduce(1)

本章节将分为InputFormat,split,OutputFormat三个小章节来介绍框架原理 1.InputFormat 1.1 切片: 将输入数据分成几份,每份交给一个MapTask去处理(getSplit方法) 对于MapRedcue,切片发生在客户端,任务提交的时候 机制:MapTask并行度决定机制 切了多少片,就开启多少个M…

颠覆世界的“数字孪生”到底是什么?这篇文章带你搞懂全部内涵!

在春节很火的电影《流浪地球2》中,已经去世的小女孩图丫丫,被她的父亲重新将其个人的信息模型导入最强大的计算机而“复活”了。屏幕中的丫丫就是一个数字孪生体。我们可以看到她的一颦一笑,听到她跟你的对话,看到她做出反应。这就…

【细读Spring Boot源码】启动步骤

前言 版本:spring-boot-2.7.3 | spring-context-5.3.22 main函数 直接使用静态函数启动 public static void main(String[] args) {SpringApplication.run(SettlleApplication.class, args); }静态帮助程序,可用于使用默认设置从指定源运行SpringAppli…

港联证券|人民币大消息!美科技股涨嗨,微软一夜暴增超万亿!

当地时间26日,美股三大股指收盘涨跌纷歧。到收盘,道指报33301.87点,下跌0.68%;标普500指数报4055.99点,下跌0.38%;纳指报11854.35点,上涨0.47%。 榜首共和银行大跌29.75%,该股昨天大…

SuperMap iClient3D for Cesium 构建隧道

背景 前段时间看到一篇构建隧道的文章(https://blog.csdn.net/supermapsupport/article/details/128453116),突然想到一个使用场景:隧道通常是建在山体下面,是否可以通过这种方式构建出一条贯穿山体的隧道&#xff0c…

mysql如何加行锁

一、概述 InnoDB 引擎是支持行级锁的,而 MyISAM 引擎并不支持行级锁,所以后面的内容都是基于 InnoDB 引擎的。当我们使用delete、update进行数据库删除、更新的时候,数据库会自动加上行锁。但是,行锁有时也会失效。 数据库版本&a…

正则表达式 - 边界

目录 一、零宽断言 二、行的开始和结束 1 . ^ 与 $ 2. dotall 模式 三、单词边界和非单词边界 1. 统计某个单词出现的次数 2. 统计单词个数 四、主题词的起始与结束位置 五、使用元字符的字面值 六、在段首加标签 一、零宽断言 断言(assertions&#xff0…

颜色选择器vue3-colorpicker

其他选择器:一款支持vue3 的颜色选择器 | ColorPickerV3基于vue3的颜色选择器支持颜色透明度与rgba、hexhttps://colorpickerv3.wcrane.cn/guide/#%E7%89%B9%E7%82%B9 这个选择器也挺好看的, 只是貌似不能外部打开选择器面板 官网:Webpack Ap…

第五章:多表查询

一、笛卡尔积的多表查询 1.案例 查询员工名为’Abel’的员工在哪个城市工作? 2.出现笛卡尔积(交叉连接)的错误 select employee_id, department_name from employees,departments为什么出现2889条记录? Employees 107 Departments 27 …

Python 一元线性回归模型预测实验完整版

一元线性回归预测模型 实验目的 通过一元线性回归预测模型,掌握预测模型的建立和应用方法,了解线性回归模型的基本原理 实验内容 一元线性回归预测模型 实验步骤和过程 (1)第一步:学习一元线性回归预测模型相关知识。 线性回归模型属于…

如何高质量的提问题让chatgpt更明白我们的意图

如何更好地向 ChatGPT 提问 ChatGPT是一款基于深度学习的人工智能语言模型,用户可以通过文本输入向其提问并获得自然语言回答。以下是如何更好地向ChatGPT提问的几个建议: 确定问题类型。ChatGPT的训练数据源广泛,支持各种类型的问题&#x…

[INFOCOM 2019] NeuralWalk:使用神经网络的在线社交网络中的信任评估

NeuralWalk: Trust Assessment in Online Social Networks with Neural Networks | IEEE Conference Publication | IEEE Xplore 摘要: 评估信任社交网络(TSN)中用户之间的信任是许多应用中的关键问题,例如电影推荐,…