Nacos支援使用TLS(Transport Layer Security)來保護傳輸資料的安全性。TLS是一種常用的加密協議,能確保在網路通訊中傳輸的資料安全。開啟TLS功能後,Nacos用戶端和服務端之間的所有資料都將被加密,以防止敏感資訊在傳輸過程中被竊取或篡改。
前提條件
建立Nacos引擎且執行個體版本大於2.1.2.1。如果執行個體版本低於2.1.2.1,請將引擎版本升級至2.1.2.1及以上。具體操作,請參見升級引擎版本。
JDK 8版本為u252及以上。
說明jdk8 u252版本以下的JDK與TLS存在相容性問題,因此該版本以下的請升級JDK版本。如果無法升級JDK版本,請使用純淨版本nacos-client。具體操作,請參見如何引入純淨版nacos-client?。
純淨版nacos-client可使用OPENSSL作為SSL Provider,但需要將
nacos.remote.client.rpc.tls.provider參數移除。純淨版本Nacos沒有對依賴二方包進行Shade,因此可能需要額外解決包衝突問題。
步驟一:修改Nacos參數設定
登入MSE註冊配置中心管理主控台,並在頂部功能表列選擇地區。
在左側導覽列,選擇注册配置中心 > 实例列表。單擊目標執行個體名稱。
在左側導覽列,單擊參數設定。單擊編輯,將TLSEnabled參數設定為是,然後單擊儲存並重啟執行個體。
重啟後服務端便可支援TLS的Nacos用戶端。
步驟二:用戶端nacos-client升級
nacos-client從2.2.1版本開始支援TLS傳輸鏈路加密。
升級至nacos-client 2.2.1版本。相關代碼如下所示。
<dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>2.2.1</version> </dependency>設定
tls參數,開啟TLS功能。tls參數有三種設定方式,優先順序為properties檔案 > JVM參數 > 環境變數。您可根據實際情況選擇參數設定方式。設定properties檔案。構建NacosConfigService和NacosNamingService時在properties檔案中傳遞參數。
properties.put("nacos.remote.client.rpc.tls.enable","true");properties.put("nacos.remote.client.rpc.tls.trustAll","true");properties.put("nacos.remote.client.rpc.tls.provider","JDK");
該模式優先順序高於JVM參數和環境變數,可以控制在NacosConfigService和NacosNamingService執行個體維度。
設定JVM參數。
-Dnacos.remote.client.rpc.tls.enable=true-Dnacos.remote.client.rpc.tls.trustAll=true-Dnacos.remote.client.rpc.tls.provider=JDK
該模式的生效範圍控制在JVM進程維度,進程內沒有在properties屬性中指定
tls參數的NacosConfigService和NacosNamingService均會生效。
設定環境變數。
nacos_remote_client_rpc_tls_enable=truenacos_remote_client_rpc_tls_trustAll=truenacos_remote_client_rpc_tls_provider=JDK
該模式的生效範圍控制在伺服器維度,所有沒有在JVM參數和
properties屬性中指定tls參數的均會生效。
確認TLS加密生效。
查看開機記錄。
nacos-client在啟動過程中會在
{user.home}/logs/nacos/remote.log中列印啟動時的配置參數。2023-04-06 09:56:56.539 INFO [com.alibaba.nacos.client.Worker:c.a.n.c.r.c.g.GrpcClient] grpc client connection server:mse-xxx.nacos-ans.mse.aliyuncs.com ip,serverPort:9848,grpcTslConfig:{"sslProvider":"","enableTls":true,"mutualAuthEnable":false,"trustAll":true}"enableTls":true表示開啟TLS功能。如果用戶端正常啟動並且佈建服務讀寫正常,則表示資料通訊已經加密。通過
tcpdump命令抓取資料包。可以通過
tcpdump命令抓取資料包並指定輸出檔案的路徑。tcpdump命令如下所示,內容會產生到/tmp/tcptrace.cap檔案中,檔案名稱和路徑支援自訂。sudo tcpdump -i any -w /tmp/tcptrace.cap -p 9848通過報文分析工具(例如Wireshark)解析上述檔案,如果報文中的參數格式為TCP&TLS,則表示已經加密。
常見問題
如何引入純淨版nacos-client?
相關代碼如下所示。
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.2.1</version>
<classifier>pure</classifier>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-common</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-api</artifactId>
<version>2.2.1</version>
</dependency>服務端引擎開啟TLS時,對於舊版本nacos-client是否支援加密?
nacos-client版本也需要同步升級才會進行資料轉送加密。
服務端引擎開啟TLS時,對於舊版本nacos-client是否有相容性問題?
引擎側預設以相容模式啟動,可以支援舊版本非TLS用戶端正常訪問。
當前MSE Nacos支援的認證模式是單向認證還是雙向認證?
當前MSE Nacos支援的是單向認證模式,用戶端認證服務端,服務端不會認證用戶端。
用戶端為什麼使用trustAll模式?
使用trustAll可以降低用戶端接入TLS的複雜度。如果對安全性有更高要求,可以諮詢MSE官方答疑(釘群:43525005207),引入MSE的官方CA認證並且指定其為信任的CA檔案。參數指定方式如下:
properties檔案:
nacos.remote.client.rpc.tls.trustCollectionChainPath=file:{filePath}JVM參數:
-Dnacos.remote.client.rpc.tls.trustCollectionChainPath=file:{filePath}環境變數:
nacos_remote_client_rpc_tls_trustCollectionChainPath=file:{filePath}
參數優先順序:properties檔案 > JVM > 環境變數。
通過properties屬性檔案注入TLS參數為什麼沒有生效?
通過properties設定TLS參數時,屬性值類型需為String類型,請勿傳入boolean類型的值。
正確的方式:
properties.put("nacos.remote.client.rpc.tls.enable","true");錯誤的方式:
properties.put("nacos.remote.client.rpc.tls.enable",true);
nacos-client日誌中,出現日誌NotSslRecordException: not an SSL/TLS record如何處理?
該日誌表示服務端返回的報文不是TLS格式,出現該異常情況是因為服務端沒有開啟TLS功能,需要開啟服務端TLS功能。具體操作,請參見修改Nacos參數設定。