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=true
nacos_remote_client_rpc_tls_trustAll=true
nacos_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参数设置。