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 參考
5 社群
本文整理程式碼示例詳見 https://github.com/apache/dub... 。
歡迎釘釘掃碼加入 dubbogo 社群釘釘群【釘釘群號 23331795】進行交流。