热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:扩展Nacos使其支持https和登陆拉取配置com.alibaba.nacos.client.naming.tls.enable

篇首语:本文由编程笔记#小编为大家整理,主要介绍了扩展Nacos使其支持https和登陆 拉取配置 com.alibaba.nacos.client.naming.tls.enable相关的知识,希望

篇首语:本文由编程笔记#小编为大家整理,主要介绍了扩展Nacos使其支持https和登陆 拉取配置 com.alibaba.nacos.client.naming.tls.enable相关的知识,希望对你有一定的参考价值。



官方依赖版本:

nacos-server :1.2.1
nacos-config-spring-boot.version :0.2.7

nacos server支持启用鉴权
### If turn on auth system:
nacos.core.auth.enabled=true

按照官方example( https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example/nacos-spring-cloud-config-example )配置好 发现客户端连接不上,总是403的错误,根据惯例来讲,这是没有授权引起的,然后我去github上找了下,果然有人提了这个 issue

技术图片 技术图片

 

问题有了,那么接下来追踪产生的原因。

 

跟踪源码发现 login 方法调用HttpClient 而 nacos server的数据接口是用ServerHttpAgent->HttpSimpleClient ,都是对HttpConnection的包装,但内部url拼接规则不同

技术图片

 

由于这里拼接了“/”,导致 nacos上下文配置拼接时路径变成了//

nacos.config.context-path=/nacos
nacos server端使用了spring security进行权限,在新版的spring security中,对url进行了规则强校验,不允许类似“http://127.0.0.1//xxx”这种"//“出现,导致出现获取配置出现500的错误。(如果设置nacos.config.context-path=nacos 又会导致登陆失败,拿不到accessToken)


 

所以如果要不该源码实现 登陆权限 拉取配置需要 通过代理转换请求地址。

于是在nacos server端配置nginx 代理请求

技术图片

 

在访问nacos前加入一层nginx

location / {

          proxy_pass http://127.0.0.1:8848/;

        }

    location /n/nacos {

          proxy_pass http://127.0.0.1:8848/nacos/;

        }

这样做的目的是为了重写”//“为”/",保证security的url校验能够成功,

其中 nacosserver是nacos的访问url,这里我配置了两个,第一个是访问nacos的管理界面,第二个是client注册nacos的url

 

这样登陆授权是满足了,http明文传输配置中心的密码等敏感信息还是不够安全,所以扩展nacos使其支持https就是问题了

由于ServerHttpAgent类源码写死了 isSSL=false,看来不该源码不行了。(本来想替换ClientWorker的agent实例,结果发现是
NacosConfigService New出来的,和Spring框架设计上的差距有点大啊————)


 

好吧,源码开撸>>>>

修改ServerHttpAgent

private String getUrl(String serverAddr, String relativePath,boolean isSSL) {
String cOntextPath= serverListMgr.getContentPath().startsWith("/") ?
serverListMgr.getContentPath() : "/" + serverListMgr.getContentPath();
String url= StringUtils.removeEnd(serverAddr,"/")+"/"+StringUtils.removeStart(contextPath,"/")+ relativePath;
if (isSSL &&url.startsWith(httpPre)){
return httpsPre+StringUtils.removeStart(url,httpPre);
}else{
return url;
}
}


SecurityProxy.java

if (HttpClient.ENABLE_HTTPS){
url = "https://" + server + contextPath + LOGIN_URL;
}else {
url = "http://" + server + contextPath + LOGIN_URL;
}
if (server.contains(Constants.HTTP_PREFIX)||server.contains(Constants.HTTPS_PREFIX)) {
url = server + contextPath + LOGIN_URL;
}


为了避免证书 校验 请求域名的问题 对HttpConnection所在类做了以下处理

static {
try {
trustAllHttpsCertificates();
HttpsURLConnection.setDefaultHostnameVerifier
(
(urlHostName, session) -> true
);
} catch (Exception e) {
}
}
private static void trustAllHttpsCertificates()
throws NoSuchAlgorithmException, KeyManagementException {
TrustManager[] trustAllCerts = new TrustManager[1];
trustAllCerts[0] = new TrustAllManager();
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, null);
HttpsURLConnection.setDefaultSSLSocketFactory(
sc.getSocketFactory());
}
private static class TrustAllManager
implements X509TrustManager {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkServerTrusted(X509Certificate[] certs,
String authType) {
}
public void checkClientTrusted(X509Certificate[] certs,
String authType) {
}
}


为了避免配置过于杂乱,对于是否启用ssl依然复用 这个属性

com.alibaba.nacos.client.naming.tls.enable





启动类加System.setProperty("com.alibaba.nacos.client.naming.tls.enable","true")或者  启动命令加-Dcom.alibaba.nacos.client.naming.tls.enable

 

完整代码参见我的github  https://github.com/huawenyao/nacos ,欢迎start~

 




关键源码

ServerHttpAgent.httpGet

private String getUrl(String serverAddr, String relativePath) {

return serverAddr + "/" + serverListMgr.getContentPath() + relativePath;

}

 

public NacosConfigService(Properties properties) throws NacosException {

String encodeTmp = properties.getProperty(PropertyKeyConst.ENCODE);

if (StringUtils.isBlank(encodeTmp)) {

encode = Constants.ENCODE;

} else {

encode = encodeTmp.trim();

}

initNamespace(properties);

agent = new MetricsHttpAgent(new ServerHttpAgent(properties));

agent.start();

worker = new ClientWorker(agent, configFilterChainManager, properties);

}

 



 

推荐:vi设计公司

推荐阅读
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • Centos7搭建ELK(Elasticsearch、Logstash、Kibana)教程及注意事项
    本文介绍了在Centos7上搭建ELK(Elasticsearch、Logstash、Kibana)的详细步骤,包括下载安装包、安装Elasticsearch、创建用户、修改配置文件等。同时提供了使用华为镜像站下载安装包的方法,并强调了保证版本一致的重要性。 ... [详细]
  • 本文介绍了网页播放视频的三种实现方式,分别是使用html5的video标签、使用flash来播放以及使用object标签。其中,推荐使用html5的video标签来简单播放视频,但有些老的浏览器不支持html5。另外,还可以使用flash来播放视频,需要使用object标签。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 判断编码是否可立即解码的程序及电话号码一致性判断程序
    本文介绍了两个编程题目,一个是判断编码是否可立即解码的程序,另一个是判断电话号码一致性的程序。对于第一个题目,给出一组二进制编码,判断是否存在一个编码是另一个编码的前缀,如果不存在则称为可立即解码的编码。对于第二个题目,给出一些电话号码,判断是否存在一个号码是另一个号码的前缀,如果不存在则说明这些号码是一致的。两个题目的解法类似,都使用了树的数据结构来实现。 ... [详细]
  • Python15行代码实现免费发送手机短信,推送消息「建议收藏」
    Python15行代码实现免费发 ... [详细]
  • 服务网关与流量网关
    一、为什么需要服务网关1、什么是服务网关传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关& ... [详细]
  • 寻求更强大的身份和访问管理(IAM)平台的企业正在转向云,并接受身份即服务(IDaaS)的灵活性。要为IAM选择正确的场外解决方案,业务管理人员和IT专业人员必须在实施之前评估安全 ... [详细]
author-avatar
r_elease靜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有