在Dubbo-go中使用TLS加密進行安全通訊

語言: CN / TW / HK

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 參考

5 社群

本文整理程式碼示例詳見 https://github.com/apache/dubbo-go-samples/tree/master/tls

歡迎釘釘掃碼加入 dubbogo 社群釘釘群【釘釘群號 23331795】進行交流。

image.png