在Dubbo-go中使用TLS加密进行安全通信
1 背景
Dubbo-go在Getty/Triple/Grpc三个通信层面支持TLS链路安全通信。
2 原理
2.1 证书机制:
ps: 可以先提前了解非对称加密机制。
CA(Certification Authority)负责生成根证书、签发证书等等。CA自签证书的过程如下:
- CA生成公钥 ca_KeyPub 和私钥 ca_KeyPri,以及基本信息表 ca_Info。ca_Info 中一般包含了CA的名称、证书的有效期等信息。
- CA对(ca_KeyPub + ca_Info)进行散列运算,得到散列值 ca_Hash。
- CA使用其私钥 ca_KeyPri 对 ca_Hash 进行非对称加密,得到加密的散列值 enc_ca_Hash。
- CA将(ca_KeyPub + ca_Info + enc_ca_Hash)组合生成自签名的数字证书「ca_Cert」。这张证书称之为根证书。
- 根证书(ca_Cert)包含的内容:ca_KeyPub + ca_Info + enc_ca_Hash。 (ca_Cert)可用于签署下一级的证书。根证书是自签名的,不需要其他机构认证。公钥私钥的生成可以利用OpenSSL等工具。
当需要签发证书时,在本地生成公钥和私钥,向CA发起CSR请求(Certificate Signing Request), CA校验此请求之后,颁发证书。过程如下:
- 证书申请者(S)在本地生成公钥 s_KeyPub 和私钥 s_KeyPri,以及基本信息表 s_Info。s_Info 中一般包含了证书申请者的名称、证书有效期等信息。
- 证书申请者将 s_KeyPub、s_Info 发送给认证机构CA,即发起CSR请求。
- CA通过某种方式验证申请者的身份之后,再加上根认证机构自己的一些信息 ca_Info,然后对它们(s_KeyPub + s_Info + ca_Info)进行散列运算,得到散列值 s_Hash。
- CA使用其私钥 ca_KeyPri 对 s_Hash 进行非对称加密,得到加密的散列值 enc_s_Hash。
- 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。其认证过程如下:
- 客户端连接到服务端
- 服务器出示其 TLS 证书(s_cert),包括服务端公钥、CA的信息等。
- 客户端验证服务器的证书,用CA的公钥即可校验。
- 客户端和服务器通过加密的 TLS 连接交换信息
除此之外,还有更安全的加密方式mTLS。在 mTLS 中,客户端和服务器都有一个证书,并且双方都使用它们的公钥/私钥对进行身份验证。其认证过程如下:
- 客户端连接到服务端
- 服务端出示其 TLS 证书(s_cert),包括服务端公钥、服务端CA的信息等。
- 客户端验证服务端的证书,用服务端CA的公钥校验。
- 客户端出示其 TLS 证书(c_cert),包括客户端公钥、客户端CA的信息等。这里注意客户端和服务端的CA可能不是同一个。
- 服务端验证客户端的证书,用客户端CA的公钥校验。
- 服务端授予访问权限
- 客户端和服务器通过加密的 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
- 启动示例
本示例提供了Dubbo、Grpc、Triple三种通信方式的TLS加密示例,分别位于tls/dubbo
、tls/grpc
、tls/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/36832100
- 2 https://www.cloudflare.com/zh-cn/learning/access-management/what-is-mutual-tls/
5 社区
本文整理代码示例详见 https://github.com/apache/dubbo-go-samples/tree/master/tls 。
欢迎钉钉扫码加入 dubbogo 社区钉钉群【钉钉群号 23331795】进行交流。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Kagol:2022年最值得推荐的前端开源文章
大家好,我是 Kagol,Vue DevUI 作者,从2020年开始一直专注于前端开源组件库的建设,在前端开源组件库、开源社区运营方面积累了一些经验,2020年主要的创作也是围绕前端组件库和开源两个主题展开。 我的组件设计积木理论 我觉得界面开发就像搭积木一样有趣,开发之前先把界面拆分成分层的多个模块,然后自顶向下用一个个积木进行拼接,其中最关键的就是组件的设计。 因此我将自己的组件设计观沉淀成了四篇小文,以 Carousel 走马灯组件为例进行深入浅出的阐述。 第一篇是总纲,介绍理论 前端开发的积木理论——像搭积木一样做前端开发 第二篇是基于理论的实现 用积木理论设计一个灵活好用的Carousel走马灯组件 第三篇是延伸,解释为什么要设计子组件 CarouseIndicator 组件应用:0行JS代码实现好看的手风琴式折叠卡片效果 第四篇以应用收尾,通过丰富的使用场景描述积木理论的强大 用积木理论设计的Carousel组件都有哪些有趣的玩法? 四篇文章层层递进,深入浅出,虽然短小,但是五脏俱全,自成闭环。 开源组件库的沉淀 Vue DevUI 开源组件库组件的设计基本遵循积木理论,这...
- 下一篇
Solon Java Framework 1.11.6 发布
一个更现代感的 Java 应用开发框架:更快、更小、更自由。没有 Spring,没有 Servlet,没有 JavaEE;独立的轻量生态。主框架仅 0.1 MB。 @Controller public class App { public static void main(String[] args) { Solon.start(App.class, args); } @Get @Socket @Mapping("/hello") public String hello(@Param(defaultValue = "java") String name) { return String.format("Hello %s!", name); } } 入门探索视频(用户录制): 相对于 Spring Boot 和 Spring Cloud 的项目: 启动快 5 ~ 10 倍。 (更快) qps 高 2~ 3 倍。 (更高) 运行时内存节省 1/3 ~ 1/2。 (更少) 打包可以缩小到 1/2 ~ 1/10;比如,300Mb 的变成了 23Mb。 (更小) ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- MySQL8.0.19开启GTID主从同步CentOS8