Nacos使用https保护数据安全

背景

我们生产环境是一个独立机房,机房内的服务器不允许远程,而且开发人员不能运维。代码的配置文件放在应用本地就很被动,这个时候我们想到使用配置中心组件,然后就了解到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版本

结果

  1. 首先看springboot获取到的配置是不是对的
    在这里插入图片描述
    结果是对的。

  2. 那我继续使用Wireshark抓包,看看数据是不是被加密了
    在这里插入图片描述
    结果还是很美好的,数据被加密了。

结论

Nacos是可以支持https对数据进行加密的,只是在没有找到相关介绍,也可能是因为我接触得比较晚

最后我们的方案是IP白名单+Authentication+Https,以此来保证数据的安全性,即使被窃取了也是密文。

当然如果你的配置项非常敏感,那还是把Nacos-Server放入到跟应用同一个网络中,不要使用互联网。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以通过以下步骤实现Feign与Nacoshttps微服务调用: 1. 在Nacos中配置https协议的微服务实例,确保服务已经正常运行。 2. 在Feign客户端中配置https请求的方式,可以参考以下代码: ```java @Configuration public class FeignHttpsConfig { @Bean public OkHttpClient okHttpClient() { return new OkHttpClient.Builder() .sslSocketFactory(createSSLSocketFactory()) .hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }) .build(); } private SSLSocketFactory createSSLSocketFactory() { SSLSocketFactory sslSocketFactory = null; try { SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, new TrustManager[]{new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } }}, new SecureRandom()); sslSocketFactory = sslContext.getSocketFactory(); } catch (Exception e) { e.printStackTrace(); } return sslSocketFactory; } } ``` 3. 在Feign客户端中使用@FeignClient注解指定微服务名称,并通过@RequestLine注解指定https请求的方式,例如: ```java @FeignClient(name = "example-service", configuration = FeignHttpsConfig.class) public interface ExampleFeignClient { @RequestLine("GET /example") String getExample(); } ``` 4. 在应用启动类中添加@EnableFeignClients注解,以启用Feign客户端。 5. 调用Feign客户端的方法即可实现https微服务调用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值