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

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

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

对称加密:

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

非对称加密:

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

TLS与CA

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

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

1. CA 相关文件

文件名 含义
ca cert.pem CA 的根证书:可信 CA 机构生成的公开证书,用于验证服务器和客户端的证书。
ca key.pem CA 的私钥: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 服务器加解密和签名私钥,必须保密。
可选客户端 CA client 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 核心代码

服务端配置:

go 复制代码
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))

客户端配置:

go 复制代码
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 核心代码

服务端配置:

go 复制代码
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))

客户端配置:

go 复制代码
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))
相关推荐
Linux520小飞鱼30 分钟前
T-SQL语言的学习路线
开发语言·后端·golang
鲁子狄35 分钟前
[笔记] 使用 Jenkins 实现 CI/CD :从 GitLab 拉取 Java 项目并部署至 Windows Server
java·windows·笔记·ci/cd·ssh·gitlab·jenkins
IT古董1 小时前
【权限管理】Apache Shiro学习教程
java·apache·shiro·权限
风月歌2 小时前
基于Spring Boot的海滨体育馆管理系统的设计与实现
java·spring boot·后端
ggdpzhk6 小时前
idea 编辑竖列:alt +shift+insert
java·ide·intellij-idea
hikktn6 小时前
Java 兼容读取WPS和Office图片,结合EasyExcel读取单元格信息
java·开发语言·wps
迪迦不喝可乐6 小时前
软考 高级 架构师 第十一章 面向对象分析 设计模式
java·设计模式
檀越剑指大厂7 小时前
【Java基础】使用Apache POI和Spring Boot实现Excel文件上传和解析功能
java·spring boot·apache
苹果酱05677 小时前
Golang的网络流量分配策略
java·spring boot·毕业设计·layui·课程设计
小青柑-7 小时前
Go语言中的接收器(Receiver)详解
开发语言·后端·golang