golang grpc ssl
- 无CA场景
在不考虑CA的场景下呢,client有client.key和client.crt,server有server.key和server.crt,生成方式可以如下:
$ openssl genrsa -out server.key 2048
$ openssl req -new -x509 -days 3650 \-subj "/C=GB/L=China/O=grpc-server/CN=server.grpc.io" \-key server.key -out server.crt$ openssl genrsa -out client.key 2048
$ openssl req -new -x509 -days 3650 \-subj "/C=GB/L=China/O=grpc-client/CN=client.grpc.io" \-key client.key -out client.crt
key对应的是私钥,crt对应的是公钥
如果需要认证呢,首先, 认证分为单向认证和双向认证。
单向认证,client对server的认证,
双向认证,顾名思义是client和server相互认证
那么,对于client认证server来说,需要把server的公钥server.crt传给client,代码如下:
client
func main() {creds, err := credentials.NewClientTLSFromFile("server.crt", "server.grpc.io",)if err != nil {log.Fatal(err)}conn, err := grpc.Dial("localhost:5000",grpc.WithTransportCredentials(creds),)if err != nil {log.Fatal(err)}defer conn.Close()...
}
server
func main() {creds, err := credentials.NewServerTLSFromFile("server.crt", "server.key")if err != nil {log.Fatal(err)}server := grpc.NewServer(grpc.Creds(creds))...
}
那么对于双向认证来说,不仅client需要校验server的公钥server.crt,server同样需要校验client的公钥client.crt
server
func main() {creds, err := credentials.NewServerTLSFromFile("server.crt", "server.key")if err != nil {log.Fatal(err)}server := grpc.NewServer(grpc.Creds(creds))...
}
client
func main() {creds, err := credentials.NewClientTLSFromFile("server.crt", "server.grpc.io",)if err != nil {log.Fatal(err)}conn, err := grpc.Dial("localhost:5000",grpc.WithTransportCredentials(creds),)if err != nil {log.Fatal(err)}defer conn.Close()...
}
- 对于有Ca的场景,ca就是一个第三方认证机构,来保证
一般来说,ca的证书生成如下
生成ca私钥
openssl genrsa -out ca.key 4096
生成CA证书
openssl req -new -x509 -days 365 -subj "/C=GB/L=Beijing/O=github/CN=liuqh.icu" \
-key ca.key -out ca.crt
这样我们就得到了一个ca.crt的ca证书
然后我们如何用ca证书对公钥进行签发呢?一般流程如下
以client端举例
生成私钥
openssl genrsa -out client.key
生成CSR
openssl req -new -subj "/C=GB/L=Beijing/O=github/CN=liuqh.icu" \
-key client.key -out client.csr
基于CA签发证书
openssl x509 -req -sha256 -CA ca.crt -CAkey ca.key -CAcreateserial -days 365 \
-in client.csr -out client.crt
其实这里感觉屏蔽了很多细节。首先我们要知道,基于ca签发证书,本质是通过ca的私钥加密生成了client公钥client.crt,如果server安装了ca.crt,则server就获得了ca的公钥,这样可以对ca签发的client.crt进行解密验证。反向是相同道理的。
那我们再分析几种场景的写法,首先单向认证,client验证server,那么client只需要ca.crt即可验证server了
client
func main() {// Load the server's CA certificatecaCert, err := ioutil.ReadFile("ca.crt")if err != nil {log.Fatalf("failed to load CA certificate: %v", err)}caCertPool := x509.NewCertPool()if ok := caCertPool.AppendCertsFromPEM(caCert); !ok {log.Fatalf("failed to append CA certificate to the certificate pool")}// Create a new TLS configuration with the client's certificate and private keytlsConfig := &tls.Config{ServerName: nodeConfigSsl.ServerName,RootCAs: caCertPool,}// Create a new gRPC connection with the TLS transport credentialclientCreds := credentials.NewTLS(tlsConfig)conn, err := grpc.Dial("localhost:12345", grpc.WithTransportCredentials(clientCreds))if err != nil {}// Create a new gRPC client with the connectionclient := NewGreeterClient(conn)// Send a gRPC request to the serverresp, err := client.SayHello(context.Background(), &HelloRequest{Name: "Alice"})if err != nil {log.Fatalf("failed to send request: %v", err)}// Print the server's responsefmt.Println(resp.Message)
}
server
func main() {// Load the server's certificate, private key, and CA certificateserverCert, err := tls.LoadX509KeyPair("server.crt", "server.key")if err != nil {log.Fatalf("failed to load server credentials: %v", err)}// Create a new TLS configuration with the server's certificate and private keytlsConfig := &tls.Config{Certificates: []tls.Certificate{serverCert},}// Create a new gRPC server with the TLS transport credentialserverCreds := credentials.NewTLS(tlsConfig)server := grpc.NewServer(grpc.Creds(serverCreds))// Register the gRPC serverRegisterGreeterServer(server, &greeterServer{})// Listen for incoming connectionslis, err := net.Listen("tcp", ":12345")if err != nil {log.Fatalf("failed to listen: %v", err)}// Start the gRPC serverif err := server.Serve(lis); err != nil {log.Fatalf("failed to serve: %v", err)}
}
第二种双向验证,则需要client传送公钥,但是同时也server也需要传送公钥
server
func main() {// Load the server's certificate, private key, and CA certificateserverCert, err := tls.LoadX509KeyPair("server.crt", "server.key")if err != nil {log.Fatalf("failed to load server credentials: %v", err)}caCert, err := ioutil.ReadFile("ca.crt")if err != nil {log.Fatalf("failed to load CA certificate: %v", err)}caCertPool := x509.NewCertPool()if ok := caCertPool.AppendCertsFromPEM(caCert); !ok {log.Fatalf("failed to append CA certificate to the certificate pool")}// Create a new TLS configuration with the server's certificate and private keytlsConfig := &tls.Config{Certificates: []tls.Certificate{serverCert},ClientAuth: tls.RequireAndVerifyClientCert,ClientCAs: caCertPool,}// Create a new gRPC server with the TLS transport credentialserverCreds := credentials.NewTLS(tlsConfig)server := grpc.NewServer(grpc.Creds(serverCreds))// Register the gRPC serverRegisterGreeterServer(server, &greeterServer{})// Listen for incoming connectionslis, err := net.Listen("tcp", ":12345")if err != nil {log.Fatalf("failed to listen: %v", err)}// Start the gRPC serverif err := server.Serve(lis); err != nil {log.Fatalf("failed to serve: %v", err)}
}
client
func main() {// Load the client's certificate and private keyclientCert, err := tls.LoadX509KeyPair("client.crt", "client.key")if err != nil {log.Fatalf("failed to load client credentials: %v", err)}// Load the server's CA certificatecaCert, err := ioutil.ReadFile("ca.crt")if err != nil {log.Fatalf("failed to load CA certificate: %v", err)}caCertPool := x509.NewCertPool()if ok := caCertPool.AppendCertsFromPEM(caCert); !ok {log.Fatalf("failed to append CA certificate to the certificate pool")}// Create a new TLS configuration with the client's certificate and private keytlsConfig := &tls.Config{Certificates: []tls.Certificate{clientCert},ServerName: ServerName,RootCAs: caCertPool,}// Create a new gRPC connection with the TLS transport credentialclientCreds := credentials.NewTLS(tlsConfig)conn, err := grpc.Dial("localhost:12345", grpc.WithTransportCredentials(clientCreds))if err != nil {}// Create a new gRPC client with the connectionclient := NewGreeterClient(conn)// Send a gRPC request to the serverresp, err := client.SayHello(context.Background(), &HelloRequest{Name: "Alice"})if err != nil {log.Fatalf("failed to send request: %v", err)}// Print the server's responsefmt.Println(resp.Message)}
非常好的参考文章:
https://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
相关文章:
golang grpc ssl
无CA场景 在不考虑CA的场景下呢,client有client.key和client.crt,server有server.key和server.crt,生成方式可以如下: $ openssl genrsa -out server.key 2048 $ openssl req -new -x509 -days 3650 \-subj "/CGB/LChina/Og…...
华为服务器驱动下载及安装
1.服务器技术支持网站 https://support.xfusion.com/support/#/zh/home 2.选择软件下载 3.选择服务器型号 4.选择驱动 5.根据需求选择驱动 例如红帽7.4系统 6.安装驱动 自动安装驱动步骤: 1)使用BMC虚拟光驱挂载onboard_driver_xxx.iso: 2)mount /dev/sr0 /mnt …...
【Shell】常用命令合集
常用命令: 文件和目录: cd /home 进入 ‘/home’ 目录 cd … 返回上一级目录 cd …/… 返回上两级目录 cd - 返回上次所在目录 cp file1 file2 将file1复制为file2 cp -a dir1 dir2 复制一个目录 cp -a /tmp/dir1 . 复制一个目录到当前工作目录(.代表当前目录…...
15- 答题卡识别及分数判定项目 (OpenCV系列) (项目十五)
项目要点 图片读取 : img cv2.imread(./images/test_01.png)灰度图: gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)高斯模糊: blurred cv2.GaussianBlur(gray, (5, 5), 0) # 去噪点边缘检测: edged cv2.Canny(blurred, 75, 200)检测轮廓: cnts cv2.findContours(e…...
LeetCode 热题 C++ 146. LRU 缓存
力扣146 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否…...
Java线程池使用与原理解析(线程池优点、使用方法、参数含义及线程池运转机制)
为什么要使用线程池? JDK1.5后JUC包添加了线程池相关接口,在Java诞生之初并没有线程池这个概念。刚开始Java程序都是自行创建线程去处理任务。随着应用使用的线程越来越多,JDK开发者们发现有必要使用一个统一的类来管理这些线程,…...
mybatis入门配置
mybatis mybatis是一款持久层框架,用于简化JDBC开发 持久层:负责将数据保存到数据库的那一层代码JavaEE的三层架构:表现层、业务层、持久层、,就相当与mvc设计模式过程中的Controller、service、dao 1.创建一个maven模块&#…...
黑客入门(超级详细版)
据我了解,“黑客”大体上应该分为“正”、“邪”两类,正派黑客依靠自己掌握的知识帮助系统管理员找出系统中的漏洞并加以完善,而邪派黑客则是通过各种黑客技能对系统进行攻击、入侵或者做其他一些有害于网络的事情,因为邪派黑客所…...
Java多线程(三)---synchronized、Lock和volatile
Java内存模型(非JVM)Java内存模型(Java Memory Model简称JMM),是一种共享内存模型,是多线程的东西,并不是JVM(Java Virtual Machine(Java虚拟机)的缩写),这是俩玩意儿!&a…...
JVM-Java内存区域
运行时数据区:1、程序计数器:当前线程所执行的字节码指令的行号指示器。在Java虚拟机的概念模型里,字节码解释器的工作就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环…...
毕业季,毕业论文查重,paper系列五个免费查重网站推荐
推荐五个常用的免费查重网站 注意: (1)这些网站基本上都可以通过关注公众号或者转发等来获取免费查重机会,但有些也会有字数限制。每个网站的数据库可能不同,所以建议大家多换几个平台查一查,反正是免费的…...
破解票房之谜:为何高票房电影绕不过“猫眼们”?
如此火爆的春节档很多,如此毁誉参半的春节档鲜有。2023开年,集齐张艺谋、沈腾的《满江红》,以及有票房前作打底的《流浪地球2》接连两部春节档电影票房进入前十,为有些颓靡的中国电影市场注入了一针“强心剂”。与票房同样热闹起来…...
订单服务-----遇到的问题及解决方案
订单服务的问题及解决方案问题1:Feign远程调用时丢失请求头编辑出现这个Feign远程调用时丢失请求头的问题是因为Feign在远程调用的时候会创建一个新的请求,但是这个新的请求里啥都没有,没有cookie值,而这个cookie值里有成功登录后…...
项目经理如何度量项目?及项目度量指标实例【静说】
度量项目是项目经理的一个重要职责,通过度量项目,项目经理可以了解项目的进展情况,及时发现问题并采取相应的措施,以确保项目能够按时、按质、按预算完成。 分享给大家一些常见的项目度量指标: 1. 项目进度ÿ…...
我们应该如何优雅的处理 React 中受控与非受控
引言 大家好,我是19组清风。有段时间没有和大家见面了,最近因为有一些比较重要的事情(陪女朋友和换了新公司)在忙碌所以销声匿迹了一小段时间, 后续会陆陆续续补充之前构建 & 编译系列中缺失的部分,提…...
力扣热题100Day06:20. 有效的括号,21. 合并两个有序链表,22. 括号生成
20. 有效的括号 题目链接:20. 有效的括号 - 力扣(Leetcode) 思路:使用栈 (1)遇到左括号就将其对应的右括号压入到栈中 (2)如果遇到右括号 a. 如果弹出的元素与当前不等ÿ…...
【Yolov5】保姆级别源码讲解之-推理部分detect.py文件
推理部分之detect.py文件讲解1.下载Yolov5的源码2. 主函数讲解3.文件标头的注释4. main函数的5. run函数5.1 第一块参数部分5.2第二块,传入数据预处理5.3 第三块创建文件夹5.4 第四块 加载模型的权重5.5 第五块 Dataloader 加载模块5.6 第六块 推理部分 Run inferen…...
无重叠区间-力扣435-java贪心策略
一、题目描述给定一个区间的集合 intervals ,其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。示例 1:输入: intervals [[1,2],[2,3],[3,4],[1,3]]输出: 1解释: 移除 [1,3] 后,剩下的区间没有重叠。…...
Python使用VTK对容积超声图像进行体绘制(三维重建)
目录VTK简介什么是体绘制?体绘制效果图流程CodeQ&AReferenceVTK简介 VTK(Visualization Toolkit)是一个用于3D计算机图形学、图像处理和可视化的开源软件包。它包括一组C类和工具,可以让用户创建和处理复杂的3D图形和数据可视…...
JAVA设计模式之工厂模式讲解
目录 前言 开始表演 前言 Java中使用工厂模式的主要原因是为了实现代码的灵活性和可维护性。工厂模式是一种创建型设计模式,它提供了一种将对象的创建和使用进行分离的方式。具体来说,工厂模式可以将对象的创建过程封装在一个独立的工厂类中ÿ…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
