1背景Dubbo-go支持Getty/Triple/Grpc三种通信级别的TLS链路安全通信。2原理2.1证书机制:ps:可以提前了解非对称加密机制。CA(CertificationAuthority)负责生成根证书、颁发证书等。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请求(CertificateSigningRequest)。CA验证请求后,颁发证书。过程如下:证书申请人(S)在本地生成公钥s_KeyPub和私钥s_KeyPri,以及基本信息表s_Info。s_Info一般包含证书申请者名称、证书有效期等信息。证书申请者向证书颁发机构CA发送s_KeyPub和s_Info,即发起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.2TLS机制:TLS的前身是SSL,用于通信加密。主要流程如下:在最简单的TLS机制中,只有客户端需要验证服务器,所以只有服务器需要有证书,而客户端不需要,比如我们熟悉的HTTPS。认证过程如下:客户端连接服务器server,出示自己的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.生成所需的证书和密钥。本例提供生成的证书和秘钥在目录tls1.在/x509下配置dubbogo.yaml客户端TLS配置:dubbo:tls_config:ca-cert-file:../../../x509/server_ca_cert.pemtls-cert-file:../../../x509/client2_cert.pemtls-key-file:../../../x509/client2_key.pemtls-server-name:dubbogo.test.example.com服务器TLS配置:dubbo:tls_config:ca-cert-file:../../../x509/client_ca_cert.pemtls-cert-file:../../../x509/server2_cert.pemtls-密钥文件:../../../x509/server2_key.pemtls-server-name:dubbogo.test.example.com启动示例本示例提供了Dubbo、Grpc、三重通信方式的TLS加密示例,分别位于tls/dubbo和tls/grpc,tls/三重。进入文件夹以启动示例。以tls/dubbo为例:step1:启动服务器:进入tls/dubbo/go-server/cmd,启动server.go,看到如下日志,则TLS配置生效2022-12-01T23:39:30.690+0800INFOgetty/getty_server.go:78GettyServer初始化TLSConfig配置step2:启动客户端:进入tls/dubbo/go-client/cmd,启动client.go,看到如下日志,则TLS配置生效2022-12-01T23:40:05.998+0800INFOgrpc/client.go:90GrpcClient初始化TLSConfig配置4参考1https://zhuanlan.zhihu.com/p/...2https://www.cloudflare.com/zh...5Community本文整理的代码示例详见https://github.com/apache/dub...欢迎大家到钉钉扫描二维码加入dubbogo社区的钉钉群【钉钉群号23331795】进行交流。
