背景
我们生产环境是一个独立机房,机房内的服务器不允许远程,而且开发人员不能运维。代码的配置文件放在应用本地就很被动,这个时候我们想到使用配置中心组件,然后就了解到Nacos,使用起来也挺好。但是我们不想把Nacos部署在生产环境,这样的话我们要考虑Nacos的HA和维护的问题,所以我们要把Nacos部署在办公环境机房,方便维护。但是办公机房和生产机房没有专线,只能走互联网,这就引发了我对Nacos的数据传输保护的思考。
思考
当我们开始接触Nacos的时候,Nacos的V1.2.0版本已经发布了,主要新增了鉴权和权限控制功能,这就很好,可以有效的防止非法和恶意访问。
关于Nacos的权限控制,大家可以看官方博客:Nacos 1.2.0 权限控制介绍和使用。
同时我们使用物理防火墙对IP进行限制,IP白名单+鉴权,基本上可以杜绝非法访问,但是Nacos-Server和Nacos-Client之间的数据传输协议http,那完全是明文在互联网上呀,别人监听抓包就什么都看到了,这样肯定是不行的。
然后我想既然Nacos使用了http,那是不是会支持https呢,可惜在官方和网上没有找到配置方法。
验证
首先验证一下Nacos在传输过程有没有进行加密,或者自己在http基础上做了转换,把Nacos-Server搞好,参考:Nacos 快速开始。然后Nacos-Client用官方的例子,懒得自己写了,参考:nacos-spring-boot-config-example
然后使用Wireshark进行抓包,启动spring-boot。
果然是明文,一点保护都没有
Nacos源码
既然在网上找不到Nacos的https配置,那么就是只好自己看nacos-client的源码,看看它是怎么使用nacos.config.server-addr配置项的,以及它的http-client是怎么写的。
当看到下面的代码时,看到了希望,原来Nacos是支持完整的URL格式,那就是我自己可以写https://xxx,这样就可以使用https。
别急再看看http请求是用什么实现的
用的是HttpURLConnection,这波稳了。
这算Nacos中的小彩蛋吗[\滑稽]
验证https
搭建Nacos-Server的https环境
我是使用Nginx对Nacos的8848端口进行代理,在Nginx上配置https,不考虑Nacos-server自己怎么去做https了,通过Nginx代理可以更好的去解决其他问题和更多的运维手段。
直接贴nginx.conf出来,不了解Nginx的童鞋,自己去了解。
#user nobody;
worker_processes 1;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
server {
listen 443 ssl;
server_name localhost;
ssl_certificate D:\crt\nacos_test.crt;
ssl_certificate_key D:\crt\nacos_test.key;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location /nacos {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8848/nacos;
}
}
}
注意:https证书自己想办法签,HttpURLConnection是使用JDK的证书体系,使用openssl自签的证书要导到JDK的cacerts的受信任证书中。
Nacos-Client使用https
在application.properties中把nacos.config.server-addr修改成https
nacos.config.server-addr=https://127.0.0.1
nacos.config.username=nacos
nacos.config.password=nacos
为了避免出错,我把nacos-config-spring-boot-starter升级为最新的0.27版本
结果
-
首先看springboot获取到的配置是不是对的
结果是对的。 -
那我继续使用Wireshark抓包,看看数据是不是被加密了
结果还是很美好的,数据被加密了。
结论
Nacos是可以支持https对数据进行加密的,只是在没有找到相关介绍,也可能是因为我接触得比较晚
最后我们的方案是IP白名单+Authentication+Https,以此来保证数据的安全性,即使被窃取了也是密文。
当然如果你的配置项非常敏感,那还是把Nacos-Server放入到跟应用同一个网络中,不要使用互联网。