golang工程——grpc TLS配置

news2024/12/23 16:10:43

TLS配置

非对称加密流程

TLS流程

在这里插入图片描述
在这里插入图片描述

这是单向TLS流程

ECDHE握手过程(图片来自透视Http协议课程)

浏览器发送Client Hello消息
  • 客户端向服务器打招呼,消息中包含客户端生成的随机数C,客户单的TLS版本号,可使用的密码套件列表及扩展列表。
  • 后续需要对比TLS版本号,用随机数计算秘钥。
服务器发送Server Hello消息
  • 服务器向客户端打招呼,消息包含服务器生成的随机数S,确认TLS版本号,从客户端可用密码套件列表中选用的密码套件。
  • 还需包含数字证书,用于验证。
  • 以及秘钥交换算法的参数(也就是公钥),需包含签名认证。
  • 并确认已收到了Client Hello信息。
客户端验证并计算主密钥
  • 对收到的证书和签名进行验证。根证书对服务器证书进行验签,根证书一般都是内置和预安装的
  • 验证成功后向服务器发送送秘钥交换算法的参数。
  • 服务器接收到客户端的秘钥交换算法参数(也就是私钥),开始计算master secret。先生成pre-master,根据pre-master和两个随机数算出master secret(主秘钥)。
  • 客户端也进行主秘钥的计算。之所以称为主密钥,是因为根据主密钥可生成多个会话秘钥由于不同的具体加密,如:客户端发送用的会话秘钥、服务端用的会话秘钥。
  • 目前都是明文通信,所以秘钥的生成必须很讲究,各部计算都需随机性极强的算法,保证安全性。
验证加密通信并验证

至此加密通信所用的秘钥都已生成,在此之前都是明文发送。客户端通知服务器启用加密通信并加密发送之前所发信息的摘要,服务器也做一样的事,用于验证加密通信是否可行。发送的两个消息分别是“Change Cipher Spec”和“Finished”。之后就可使用加密的Http请求和响应。

双向认证

上述方式验证了服务器的安全性,而服务器验证客户端可用更多方式,比如账号密码,此时已经达到了加密通信的标准。

更深层次的客户端验证,也可Client Hello中出示客户端证书,用以验证。最终实现更为安全的双向验证。

创建证书

openssl.cnf

[req]
distinguished_name = req_distinguished_name
attributes = req_attributes

[req_distinguished_name]

[req_attributes]

[test_ca]
basicConstraints        = critical,CA:TRUE
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid:always,issuer:always
keyUsage                = critical,keyCertSign

[test_server]
basicConstraints        = critical,CA:FALSE
subjectKeyIdentifier    = hash
keyUsage                = critical,digitalSignature,keyEncipherment,keyAgreement
subjectAltName          = @server_alt_names

[server_alt_names]
DNS.1 = *.grpc.test.com

[test_client]
basicConstraints        = critical,CA:FALSE
subjectKeyIdentifier    = hash
keyUsage                = critical,nonRepudiation,digitalSignature,keyEncipherment
extendedKeyUsage        = critical,clientAuth

#!/bin/bash

# Create the server CA certs. 服务器根证书和私钥
openssl req -x509                                     \
  -newkey rsa:4096                                    \
  -nodes                                              \
  -days 3650                                          \
  -keyout ca_key.pem                                  \
  -out ca_cert.pem                                    \
  -subj /C=US/ST=CA/L=SVL/O=gRPC/CN=test-server_ca/   \
  -config ./openssl.cnf                               \
  -extensions test_ca                                 \
  -sha256

# Create the client CA certs. 客户端根证书和私钥
openssl req -x509                                     \
  -newkey rsa:4096                                    \
  -nodes                                              \
  -days 3650                                          \
  -keyout client_ca_key.pem                           \
  -out client_ca_cert.pem                             \
  -subj /C=US/ST=CA/L=SVL/O=gRPC/CN=test-client_ca/   \
  -config ./openssl.cnf                               \
  -extensions test_ca                                 \
  -sha256

# Generate a server cert.
# 长度4096
# 生成服务器私钥
openssl genrsa -out server_key.pem 4096
# 私钥生成服务器证书请求
openssl req -new                                    \
  -key server_key.pem                               \
  -days 3650                                        \
  -out server_csr.pem                               \
  -subj /C=US/ST=CA/L=SVL/O=gRPC/CN=test-server1/   \
  -config ./openssl.cnf                             \
  -reqexts test_server
  
 # 生成服务器证书
openssl x509 -req           \
  -in server_csr.pem        \
  -CAkey ca_key.pem         \
  -CA ca_cert.pem           \
  -days 3650                \
  -set_serial 1000          \
  -out server_cert.pem      \
  -extfile ./openssl.cnf    \
  -extensions test_server   \
  -sha256
openssl verify -verbose -CAfile ca_cert.pem  server_cert.pem

# Generate a client cert. 客户端证书
# 长度4096
openssl genrsa -out client_key.pem 4096
openssl req -new                                    \
  -key client_key.pem                               \
  -days 3650                                        \
  -out client_csr.pem                               \
  -subj /C=US/ST=CA/L=SVL/O=gRPC/CN=test-client1/   \
  -config ./openssl.cnf                             \
  -reqexts test_client
openssl x509 -req           \
  -in client_csr.pem        \
  -CAkey client_ca_key.pem  \
  -CA client_ca_cert.pem    \
  -days 3650                \
  -set_serial 1000          \
  -out client_cert.pem      \
  -extfile ./openssl.cnf    \
  -extensions test_client   \
  -sha256
openssl verify -verbose -CAfile client_ca_cert.pem  client_cert.pem

rm *_csr.pem


服务器证书:

  • 服务器根证书和私钥
  • 生成服务器私钥
  • 用服务器私钥生成证书请求
  • 服务器根证书和根私钥+证书请求生成服务器证书
go grpc 配置
单向TLS

服务端

package server

import (
	"crypto/tls"
	"crypto/x509"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
	"log"
	"os"
)
func GetTlsOpt() grpc.ServerOption {
    // 服务端证书、服务端密钥
	creds, err := credentials.NewServerTLSFromFile("x509/server_cert.pem", "x509/server_key.pem")
	if err != nil {
		log.Fatal(err)
	}
	return grpc.Creds(creds)
}

客户端

package client

import (
    "crypto/tls"
    "crypto/x509"
    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials"
    "log"
    "os"
)


// 单向TLS
func GetTlsOpt() grpc.DialOption {
    // 服务端根证书,域名,根证书用来做验签
    creds, err := credentials.NewClientTLSFromFile("x509/ca_cert.pem", "echo.grpc.test.com")
    if err != nil {
        log.Fatal(err)
    }
    opt := grpc.WithTransportCredentials(creds)
    return opt

}
双向TLS

可以理解成多一个反过来的流程,双方对等

服务端

package server

import (
	"crypto/tls"
	"crypto/x509"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
	"log"
	"os"
)
func GetMTlsOpt() grpc.ServerOption {
	cert, err := tls.LoadX509KeyPair("x509/server_cert.pem", "x509/server_key.pem")
	if err != nil {
		log.Fatal(err)
	}
	ca := x509.NewCertPool()
	caFilePath := "x509/client_ca_cert.pem"
	bytes, err := os.ReadFile(caFilePath)
	if err != nil {
		log.Fatal(err)
	}
	if ok := ca.AppendCertsFromPEM(bytes); !ok {
		log.Fatal("ca append failed")
	}
	tlsConfig := &tls.Config{
		ClientAuth:   tls.RequireAndVerifyClientCert,
		Certificates: []tls.Certificate{cert},
		ClientCAs:    ca,
	}
	return grpc.Creds(credentials.NewTLS(tlsConfig))
}

客户端

package client

import (
    "crypto/tls"
    "crypto/x509"
    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials"
    "log"
    "os"
)


func GetMTlsOpt() grpc.DialOption {
    // 客户端证书和密钥
    cert, err := tls.LoadX509KeyPair("x509/client_cert.pem", "x509/client_key.pem")
    if err != nil {
        log.Fatal(err)
    }
    ca := x509.NewCertPool()
    // 服务端根证书
    caFilePath := "x509/ca_cert.pem"
    bytes, err := os.ReadFile(caFilePath)
    if err != nil {
        log.Fatal(err)
    }
    if ok := ca.AppendCertsFromPEM(bytes); !ok {
        log.Fatal("ca append failed")
    }
    tlsConfig := &tls.Config{
        ServerName:   "echo.grpc.test.com",
        Certificates: []tls.Certificate{cert},
        RootCAs:      ca,
    }
    return grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig))
}

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

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

相关文章

SkyWalking分布式链路追踪学习

为什么要用分布式链路追踪 实际生产中,面对几十个、甚至成百上千个的微服务实例,如果一旦某个实例发生宕机,如果不能快速定位、提交预警,对实际生产造成的损失无疑是巨大的。所以,要对微服务进行监控、预警&#xff0…

nodejs进阶知识

文章目录 写在前面一、dependencies、devDependencies和peerDependencies区别:二、需要牢记的npm命令2.1 npm2.2 npm config list2.3 npm配置镜像源 三、npm install 的原理四、package-lock.json的作用五、npm run 的原理六、npx6.1 npx是什么6.2 npx的优势6.3 npm…

linux使用md5sum校验下载文件是否完整/被篡改

素材:cuda的run文件(见下图)。 网址:点击这里 任务:检验下载的cuda_11.7.0_515.43.04_linux.run文件是否完整。 步骤: 图片下方倒数第2行,提供了文件的checksum。 找到我需要的checksum&#…

用Python让字符串整齐排列:左对齐、右对齐还是居中对齐?

文章目录 左对齐使用字符串的对齐属性使用`format`函数右对齐使用字符串的对齐属性使用`format`函数居中对齐使用字符串的对齐属性format 居中对齐多行字符串居中对齐在Python中,可以使用字符串的对齐属性以及format函数来实现字符串的对齐。下面将分别介绍左对齐、右对齐、居…

如何实现朋友圈一键转发?

还在用传统的发朋友圈方式吗?NO NO NO 快来看看,新的发圈姿势等你get!企业统一编辑任务,定时发送、立即发送随你心情。统一素材,一键发送,轻松操作,尤其是节假日,员工放假&#xff0…

Rust 在前端都干了些啥

前言 这里有一篇两年前的文章:Rust 是 JavaScript 基础设施的未来,应该还是有挺多人看到过的。当时在前端社区上还掀起了一阵 Rust 风,有人说怎么天天造轮子,有人说实在是学不动了,也有人抱着积极的心态去拥抱新东西。…

C++之std::atomic解决多线程7个问题(二百四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

Redis的安装与基本使用

文章目录 Linux 环境下安装Redis下载Redis 安装包解压安装包安装Redis进入redis安装包下编译并且安装到指定目录下 启动redis配置远程访问找到Redis.config文件 Windows 环境下安装Redis说明官方提供方式安装或启用WSL2在WSL(Ubuntu)上安装Redis启动Redi…

【QT+CUDA】QT中使用cuda,QT+VS+cuda下载安装配置

文章目录 相关网址汇总: 一、软件安装:VS、CUDA、QT1 安装VS1.1 下载1.2 vs2017安装1.3 vs2015安装 2 安装CUDA2.1 下载2.2 安装2.3 测试2.4 卸载 3 安装QT3.1 下载3.2 安装 二、QT使用cuda1 .pro文件 三、常用操作1 NVIDIA控制面板:显卡、驱…

口袋参谋:如何快速补充缺失的免费流量入口?30秒就可操作!

​在淘宝店铺运营过程中,流量过低怎么办? 我相信很多卖家会选择付费流量,如:直通车、引力魔方等付费推广,虽然说它们的流量来的比较快,但是也要花大价钱去投流。 如果想免费提高店铺流量的,不妨…

rv1126-rv1109-烧录方法之TFTP

注意:开机按ctrl+C既可以进入uboot指令集 因为之前习惯了用RK的烧录工具,为了兼容ssd202d的烧录方法 于是我开始尝试了使用ssd202d的方法烧录 SSD202D的方法是 烧录uboot 然后用TFTP烧录下去,于是我开始尝试 烧录前三个即可,后面的img用tftp烧录,由于工作量太…

成都直播基地排名,天府蜂巢直播基地获高知名度直播基地称号

成都直播基地的排名在近年来不断攀升,其中成都天府蜂巢直播产业基地凭借其卓越的表现获得了高知名度的直播基地称号。成都天府蜂巢直播产业基地凭借其卓越的发展成就和优质的服务,力争为西部地区打造了一个独具魅力的直播产业基地。 双方携手 提速发展 …

怎么压缩word文档的大小?

怎么压缩word文档的大小?Word文件压缩成一个普遍存在的挑战,现在看来至少是这样的。最近,我们接到了许多用户的疑问,他们想知道如何压缩Word文件大小。这个问题似乎广泛存在于办公场景中,因此我们需要找到解决方案。导…

排序算法之【希尔排序】

📙作者简介: 清水加冰,目前大二在读,正在学习C/C、Python、操作系统、数据库等。 📘相关专栏:C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

【ROS 2】-2 话题通信

飞书原文链接: Docs

文件的随机读写函数:ftell rewind

目录 函数介绍: ftell: 函数原型: 举例: 文件内容展示: 代码操作: 结果: rewind: 函数原型: 举例: 文件内容展示: 代码操作&#xff1…

JOSEF约瑟 静态中间继电器JZY-402 JZJ-404 AC220V 触点形式两开两闭

系列型号: JZY(J)-400静态中间继电器 JZ-Y-401静态中间继电器JZ-Y-402静态中间继电器 JZ-Y-403静态中间继电器JZ-Y-404静态中间继电器 JZ-Y-405静态中间继电器JZ-Y-406静态中间继电器 JZ-Y-407静态中间继电器JZ-Y-408静态中间继电器 JZ-Y-409静态中间继电器JZ…

10kv后台配电监控系统

10kv电力系统应用广泛,在各行各业都发挥着举足轻重的作用,其运行状态直接影响到电力系统的稳定性和可靠性。 一、系统概述 10kV后台配电监控系统是指对10kV配电系统的各种设备进行实时监控、调节、保护、控制和调节的现代化管理系统。通过在电力…

找高清、4K图片素材就上这6个网站,免费下载!

不会还有人找图片素材直接上网去搜吧,告诉你们6个网站,轻松找到想要的图片素材,不仅质量高,还可以免费下载,重点是还可以商用。赶紧收藏起来吧~ 1、菜鸟图库 https://www.sucai999.com/pic.html?vNTYwNDUx 网站主要为…

挺进欧洲:中国汽车如何破解品牌与成本双重困境?

摘要:2022年,中国超越德国,跻身全球第二大汽车出口大国,仅次于日本。历经国内市场的激烈竞争和技术积累,中国汽车品牌凭借在新能源技术上的优势和制造力,决定挑战欧洲-BBA(奔驰、宝马、奥迪)的主场。令人惊讶的是,尽管在21世纪初,…