当前位置: 首页 > article >正文

【gRPC】对称与非对称加解密和单向TLS与双向TLS讲解与go案例

对称加密与非对称加密对比

特性对称加密非对称加密
密钥数量一个密钥,发送方和接收方共享一对密钥:公钥(公开)和私钥(保密)
安全性密钥泄露后通信安全性完全丧失私钥泄露才会导致安全问题,公钥可公开
速度快,适合加密大数据慢,适合加密小数据(如密钥)
典型算法AES、DESRSA、ECC
应用场景数据加密、VPN数字签名、密钥交换

对称加密:

  • 加解密用同一个密钥。
  • 优点:速度快。
  • 缺点:密钥管理复杂。

非对称加密:

  • 使用一对密钥:公钥加密,私钥解密;或私钥签名,公钥验证。
  • 优点:更安全,适合身份验证和密钥分发。
  • 缺点:速度较慢。

TLS与CA

1.各种证书和密钥的含义与作用

这些文件通常出现在 TLS 通信和证书管理中,它们的作用如下:

1. CA 相关文件

文件名含义
ca cert.pemCA 的根证书:可信 CA 机构生成的公开证书,用于验证服务器和客户端的证书。
ca key.pemCA 的私钥:CA 用于签发证书时生成签名的私钥,必须严格保密。

2. 客户端 CA 相关文件(可选,用于双向TLS)

文件名含义
client ca cert.pem客户端 CA 证书:用于验证客户端证书是否由受信任的 CA 签发。
client ca key.pem客户端 CA 私钥:用于生成客户端 CA 证书签名,必须严格保密。

3. 客户端相关文件

文件名含义
client cert.pem客户端证书:由客户端 CA 或 CA 签发,证明客户端身份。
client key.pem客户端私钥:与客户端证书配对,用于加密数据和生成签名。

4. 服务器相关文件

文件名含义
server cert.pem服务器证书:由 CA 签发,证明服务器身份,客户端验证时使用。
server key.pem服务器私钥:与服务器证书配对,用于解密数据和生成签名。

总结:这些文件的关系与用途

文件类别文件名作用
CA 文件ca cert.pem验证服务器和客户端证书是否可信(根证书)。
ca key.pem签发服务器和客户端证书时生成签名(CA 私钥)。
客户端文件client cert.pem客户端身份证明,供服务器验证。
client key.pem客户端加解密和签名私钥,必须保密。
服务器文件server cert.pem服务器身份证明,供客户端验证。
server key.pem服务器加解密和签名私钥,必须保密。
可选客户端 CAclient ca cert.pem服务器验证客户端身份时,确认客户端证书的可信性(双向TLS)。
client ca key.pem签发客户端证书时生成签名(双向TLS 可选)。

工作流程中的用途

  1. 单向TLS
    • 客户端验证 server cert.pem(用 ca cert.pem)。
    • 加解密通信:客户端生成对称密钥,用 server key.pem 配合完成。
    • 在这里插入图片描述
  • 在这里插入图片描述
  1. 双向TLS
    • 客户端验证 server cert.pem,服务器验证 client cert.pem

    • ca cert.pem 验证所有证书可信性。

    • 加解密通信:

      • 客户端和服务器各自使用 client key.pemserver key.pem 完成数据保护。
    • 在这里插入图片描述

    • 在这里插入图片描述


2.TLS 与 CA 机构中的证书和密钥作用

在 TLS 通信中,证书和密钥的作用主要体现在身份验证和数据加密上。以下是关键组件的用途说明:

1. CA(Certificate Authority,证书颁发机构)

  • 作用:一个值得信任的第三方,负责颁发和验证证书。
  • 角色
  • 确保证书中的信息真实、可信。
  • 建立信任链,客户端通过 CA 的签名信任服务器证书。

2. 证书(Certificate)

  • 作用:证明服务器或客户端的身份,防止冒充。
  • 内容
  • 公钥:公开使用,用于加密数据或验证签名。
  • 证书持有者信息:如域名、组织名称等。
  • CA 的签名:保证证书真实可信。
  • 用途
  • 服务器证书:证明服务器身份,客户端验证时使用。
  • 客户端证书(双向TLS):证明客户端身份,服务器验证时使用。

3. 公钥和私钥

  • 公钥(Public Key):
  • 公开给所有人。
  • 用于:
  • 数据加密(客户端用服务器的公钥加密数据)。
  • 验证签名(验证服务器的身份)。
  • 私钥(Private Key):
  • 仅持有者自己保存,绝不公开。
  • 用于:
  • 数据解密(解密客户端加密的数据)。
  • 生成签名(证明服务器身份)。

4. 信任链(Certificate Chain)

  • 作用:建立客户端对服务器证书的信任。
  • 流程
  • 客户端检查服务器证书是否由可信 CA 签发。
  • 如果是可信 CA,信任服务器。
  • 如果不是直接签发,依次验证中间证书,直到找到根证书。

总结表格

组件主要作用
CA 机构颁发证书,建立信任链。
证书证明服务器或客户端身份,防止冒充。
公钥加密数据,验证签名(公开)。
私钥解密数据,生成签名(保密)。
信任链通过 CA 和中间证书验证服务器证书可信性,建立信任。

工作流程举例(单向TLS)

  1. 客户端请求:向服务器发送握手请求。
  2. 服务器响应:服务器发送证书(含公钥)。
  3. 验证证书:客户端用 CA 公钥验证服务器证书可信性。
  4. 对称密钥生成
  • 客户端用服务器的公钥加密对称密钥。
  • 服务器用私钥解密获得对称密钥。
  1. 数据传输:后续通信用对称密钥加密数据。

这样,证书验证身份,公私钥保护密钥,确保通信安全。


单向TLS与双向TLS对比

特性单向TLS双向TLS
证书验证客户端验证服务器证书客户端和服务器互相验证证书
安全性防止中间人攻击,保护服务器通信双向验证身份,防止未经授权的客户端接入
复杂性配置简单,适合大多数场景配置较复杂,需要管理客户端证书
应用场景网站访问、API通信银行系统、企业内部系统

单向TLS:

  • 只有服务端有证书。
  • 客户端用证书验证服务端身份。
  • 适用:用户访问网页或普通服务。

双向TLS:

  • 客户端和服务端都有证书。
  • 双方验证对方身份,确保双重信任。
  • 适用:金融、医疗等高安全场景。

总结

  • 对称加密效率高,用于数据加密;非对称加密安全性好,用于密钥交换和认证。
  • 单向TLS验证服务器身份,适合通用场景;双向TLS验证双方身份,适合高安全场景。

单向TLS与双向TLS核心代码

1.单向 TLS 核心代码

服务端配置:

creds, err := credentials.NewServerTLSFromFile("server.crt", "server.key")
if err != nil {
    log.Fatalf("Failed to load server certificates: %v", err)
}
grpcServer := grpc.NewServer(grpc.Creds(creds))

客户端配置:

creds, err := credentials.NewClientTLSFromFile("ca.crt", "")
if err != nil {
    log.Fatalf("Failed to load CA certificate: %v", err)
}
conn, err := grpc.Dial("localhost:50051", grpc.WithTransportCredentials(creds))

2.双向 TLS 核心代码

服务端配置:

serverCert, err := tls.LoadX509KeyPair("server.crt", "server.key")
if err != nil {
    log.Fatalf("Failed to load server certificates: %v", err)
}
caCert, err := ioutil.ReadFile("ca.crt")
if err != nil {
    log.Fatalf("Failed to load CA certificate: %v", err)
}
certPool := x509.NewCertPool()
certPool.AppendCertsFromPEM(caCert)

tlsConfig := &tls.Config{
    Certificates: []tls.Certificate{serverCert},
    ClientCAs:    certPool,
    ClientAuth:   tls.RequireAndVerifyClientCert, // 双向认证
}
creds := credentials.NewTLS(tlsConfig)
grpcServer := grpc.NewServer(grpc.Creds(creds))

客户端配置:

clientCert, err := tls.LoadX509KeyPair("client.crt", "client.key")
if err != nil {
    log.Fatalf("Failed to load client certificates: %v", err)
}
caCert, err := ioutil.ReadFile("ca.crt")
if err != nil {
    log.Fatalf("Failed to load CA certificate: %v", err)
}
certPool := x509.NewCertPool()
certPool.AppendCertsFromPEM(caCert)

tlsConfig := &tls.Config{
    Certificates: []tls.Certificate{clientCert},
    RootCAs:      certPool,
}
creds := credentials.NewTLS(tlsConfig)
conn, err := grpc.Dial("localhost:50051", grpc.WithTransportCredentials(creds))

http://www.kler.cn/a/474219.html

相关文章:

  • 测试开发基础知识2
  • KCP解读:C#库类图
  • vue2日历组件
  • 用python 进行雷电接口检测
  • Mac-docker配置
  • mysql -> 达梦数据迁移(mbp大小写问题兼容)
  • vue 点击按钮复制文本功能(同时解决http不安全问题)
  • c# readonly 和 const的区别和使用场景
  • Android配件应用默认启动与USB权限申请区别
  • CODESYS MODBUS TCP通信(禾川Q1 PLC作为MODBUS TCP从站)
  • 【mysql】流程控制
  • 【前端,TypeScript】TypeScript速成(八):Promise
  • 机器学习的组成
  • PDFMathTranslate: Star13.8k,一款基于AI的PDF文档全文双语翻译PDF文档全文双语翻译,保留格式神器,你应该需要它
  • R语言的语法
  • 《鸿蒙系统AI技术:筑牢复杂网络环境下的安全防线》
  • 模型评估指标总结(预测指标、分类指标、回归指标)
  • 【开源免费】基于Vue和SpringBoot的贸易行业crm系统(附论文)
  • TVbox 手机、智能电视节目一网打尽
  • HarmonyOS Next系列之华为账号一键登录功能实现(十四)
  • 【MySQL】九、表的内外连接
  • C# 实现 gRPC 进程间通讯:两台设备的数据交换之道
  • 前端笔记:获取leetcode题目
  • 【复杂网络演化博弈_01】理论部分+代码应用
  • [Unity]MacOS下开发Unity
  • TCP通信原理学习