乐趣区

关于go:在Dubbogo中使用TLS加密进行安全通信

1 背景

Dubbo-go 在 Getty/Triple/Grpc 三个通信层面反对 TLS 链路平安通信。

2 原理

2.1 证书机制:

ps: 能够先提前理解非对称加密机制。

CA(Certification Authority)负责生成根证书、签发证书等等。CA 自签证书的过程如下:

  1. CA 生成公钥 ca_KeyPub 和私钥 ca_KeyPri,以及根本信息表 ca_Info。ca_Info 中个别蕴含了 CA 的名称、证书的有效期等信息。
  2. CA 对(ca_KeyPub + ca_Info)进行散列运算,失去散列值 ca_Hash。
  3. CA 应用其私钥 ca_KeyPri 对 ca_Hash 进行非对称加密,失去加密的散列值 enc_ca_Hash。
  4. CA 将(ca_KeyPub + ca_Info + enc_ca_Hash)组合生成自签名的数字证书「ca_Cert」。这张证书称之为根证书。
  5. 根证书(ca_Cert)蕴含的内容:ca_KeyPub + ca_Info + enc_ca_Hash。
    (ca_Cert)可用于签订下一级的证书。根证书是自签名的,不须要其余机构认证。公钥私钥的生成能够利用 OpenSSL 等工具。

当须要签发证书时,在本地生成公钥和私钥,向 CA 发动 CSR 申请(Certificate Signing Request), CA 校验此申请之后,颁发证书。过程如下:

  1. 证书申请者 (S) 在本地生成公钥 s_KeyPub 和私钥 s_KeyPri,以及根本信息表 s_Info。s_Info 中个别蕴含了证书申请者的名称、证书有效期等信息。
  2. 证书申请者将 s_KeyPub、s_Info 发送给认证机构 CA, 即发动 CSR 申请。
  3. CA 通过某种形式验证申请者的身份之后,再加上根认证机构本人的一些信息 ca_Info,而后对它们(s_KeyPub + s_Info + ca_Info)进行散列运算,失去散列值 s_Hash。
  4. CA 应用其私钥 ca_KeyPri 对 s_Hash 进行非对称加密,失去加密的散列值 enc_s_Hash。
  5. CA 将(s_KeyPub + s_Info + ca_Info + enc_s_Hash)组合签订成数字证书(s_Cert)并发送给申请者。

申请者的证书(s_Cert)蕴含的内容为:s_KeyPub + s_Info + ca_Info + enc_s_Hash。

证书校验:

用 CA 的公钥对 enc_s_Hash 进行解密,失去 s_Hash,比照其是否与 hash(s_KeyPub + s_Info + ca_Info)统一。

2.2 TLS 机制:

TLS 的前身是 SSL,用于通信加密,其次要过程如下:
在最简略的 TLS 机制中,只须要对客户端对服务端进行校验,所以只须要服务端有证书,客户端不须要,比方咱们相熟的 HTTPS。其认证过程如下:

  1. 客户端连贯到服务端
  2. 服务器出示其 TLS 证书(s_cert), 包含服务端公钥、CA 的信息等。
  3. 客户端验证服务器的证书,用 CA 的公钥即可校验。
  4. 客户端和服务器通过加密的 TLS 连贯替换信息

除此之外,还有更平安的加密形式 mTLS。在 mTLS 中,客户端和服务器都有一个证书,并且单方都应用它们的公钥 / 私钥对进行身份验证。其认证过程如下:

  1. 客户端连贯到服务端
  2. 服务端出示其 TLS 证书(s_cert),包含服务端公钥、服务端 CA 的信息等。
  3. 客户端验证服务端的证书,用服务端 CA 的公钥校验。
  4. 客户端出示其 TLS 证书(c_cert),包含客户端公钥、客户端 CA 的信息等。这里留神客户端和服务端的 CA 可能不是同一个。
  5. 服务端验证客户端的证书,用客户端 CA 的公钥校验。
  6. 服务端授予拜访权限
  7. 客户端和服务器通过加密的 TLS 连贯替换信息

3 在 Dubbo-go 中应用 TLS 加密

0. 生成所须要的证书和秘钥 本示例提供曾经生成好的证书和秘钥,在目录 tls/x509

1. 配置 dubbogo.yaml

客户端 TLS 配置:

dubbo:
  tls_config:
    ca-cert-file: ../../../x509/server_ca_cert.pem 
    tls-cert-file: ../../../x509/client2_cert.pem  
    tls-key-file: ../../../x509/client2_key.pem
    tls-server-name: dubbogo.test.example.com

服务端 TLS 配置:

dubbo:
  tls_config:
    ca-cert-file: ../../../x509/client_ca_cert.pem
    tls-cert-file: ../../../x509/server2_cert.pem
    tls-key-file: ../../../x509/server2_key.pem
    tls-server-name: dubbogo.test.example.com
  1. 启动示例

本示例提供了 Dubbo、Grpc、Triple 三种通信形式的 TLS 加密示例,别离位于tls/dubbotls/grpctls/triple。进入文件夹即可启动示例。

以 tls/dubbo 为例:

  • step1: 启动服务端:

进入tls/dubbo/go-server/cmd, 启动server.go

看到如下日志,则 TLS 配置失效

2022-12-01T23:39:30.690+0800    INFO    getty/getty_server.go:78        Getty Server initialized the TLSConfig configuration
  • step2: 启动客户端:

进入tls/dubbo/go-client/cmd,启动client.go

看到如下日志,则 TLS 配置失效

2022-12-01T23:40:05.998+0800    INFO    grpc/client.go:90       Grpc Client initialized the TLSConfig configuration

4 参考

  • 1 https://zhuanlan.zhihu.com/p/…
  • 2 https://www.cloudflare.com/zh…

5 社区

本文整顿代码示例详见 https://github.com/apache/dub…。

欢送钉钉扫码退出 dubbogo 社区钉钉群【钉钉群号 23331795】进行交换。

退出移动版