zoukankan      html  css  js  c++  java
  • 真——Springcloud支持Https

    很久不写了,因为一直没有一个项目的需求推动,担心写的东西可能不是太实际。其间学习的事倒是做了不少,设计模式、领域开发、Antlr、kubernetes等等,其实大部分都记在纸质笔记上了。。

    基于对新技术的向往,以及微服务生态功能的对比调研,在技术选型上我站边Springcloud,随之而来的大量架构设计工作,部署监控工作,路漫漫其修远兮。

    小公司的小组长不太好当,需求分析、计划排期、架构、模块类图、数据库表、安全、部署、监控都要做。

    前一天boss找我,说我们之前的前后端交互太暴露了,明文密码,明文传输,安全隐患很大。鉴于我们现在的微服务架构选择了Springcloud,能不能让它支持https,密码的事另做方案。

    这自然是个修炼的机会啊。开始。

    先说下角色指代:

    Eureka:注册中心 server

    Config:配置中心

    consumer:client

    producer:client

    gateway:Zuul网关

    首先,明确目标,网上大部分标题硬核晃眼的文章实际上只做满足一半目标的事情,而且普遍做一半还会出错,贴代码往往不给出引用的包,也不说明版本。通通让读者去猜。

    故我把Springcloud支持Https这件事情分为三个小目标。

    1、正确注册到Eureka

    判断标准:Config启动后Eureka有显示

    这一步需要生成证书并添加信任,要让Java运行时信任自己生成的证书(默认还会跑到那里去找),其实应该可以做到程序里,不过资料较少,加在哪里需要研究下。

    #生成keystore,注意SAN很重要,https地址如不包含在此处,使用时则会报错

    keytool -genkey -alias server -keyalg RSA -storetype PKCS12 -keystore serverkeystore.p12 -ext SAN=dns:localhost,ip:127.0.0.1

    #导出alias为server的证书
    keytool -export -alias server -file servercert.cer -keystore serverkeystore.p12

    #将证书添加至jre信任秘钥库(alias可以不为server)
    keytool -import -alias server -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -file servercert.cer

    然后在Eureka和Config的springboot配置文件中指明https注册,

    eureka.instance.hostname=localhost

    #主要是这两条
    eureka.instance.secure-port-enabled=true
    eureka.instance.non-secure-port-enabled=false

    #因为有默认值所以要覆盖下
    eureka.instance.status-page-url=https://${eureka.instance.hostname}:${server.port}/info
    eureka.instance.health-check-url=https://${eureka.instance.hostname}:${server.port}/health
    eureka.instance.home-page-url=https://${eureka.instance.hostname}:${server.port}/

    再配置ssl秘钥库,

    server.ssl.key-store=classpath:serverkeystore.p12
    server.ssl.key-store-password=123456
    server.ssl.keyStoreType=PKCS12
    server.ssl.keyAlias=server

    此时,springboot应该默认采用https方式注册了。

    因为是自己签发的证书,如果不爽浏览器的安全提示,可以在浏览器中添加一下证书根节点。

    但是,朋友们,我们的目的不是instance成功注册而是去取注册中心的instance信息对吗。

    2、从Eureka取到各client的https地址和端口

    例:正确从Config读取配置即可

    发现这时的问题是consumer或producer取不到Instance的正确端口,

    比如consumer通过spring.cloud.config.discovery.serviceId就找不到Config的instance,改成spring.cloud.config.uri直接指定Config的https地址就没问题。

    原因就在这条配置,eureka把http和https的通信端口设置分开了:

    #安全通信端口(默认443)

    eureka.instance.securePort=your port

    也许还有一条对你起作用的配置:

    #是否优先使用IP地址作为主机名的标识,默认false(当然,如果你生成秘钥的SAN包含当前ip那也无妨)

    #eureka.instance.prefer-ip-address=true

    此时consumer或producer可以取到Config的配置。

    3、测试经Zuul转发的请求结果

    例:一个request经gateway consumer producer走通,返回符合期望即可

    此时你可以在gateway设置http端口转发https、限制访问方法(注册EmbeddedServletContainerFactory、重写addAdditionalTomcatConnectors)等。

    看到com.netflix.zuul.exception.ZuulException: Forwarding error的报错消失,至此在功能层面初步成功。

    但是,https占用资源多些,考虑到性能应只让gateway支持https,之后转发http给springcloud client。网上看到了一些文章,实现应该不成问题。

    然而这时我忽然想到,为什么不使用nginx支持https再转发http给springcloud呢?springcloud不用动的,开发测试时也方便些。

    待续。

    注:

    0、server和client当然可以配置不同的证书。

    1、Lets Encrypt提供免费、自动生成的SSL证书,到期可自动更新。

    2、使用 Lets Encrypt 生成用于 https 站点的免费 SSL 证书(集成nginx,尚未验证)  参考https://lzw.me/a/lets-encrypt-ssl.html

    3、若攻击者有意,使用Fiddler作为中间人仍可以抓取https报文。

  • 相关阅读:
    Linux中find命令用法全汇总,看完就没有不会用的!
    ubuntu16.04 通过命令,修改屏幕分辨率
    Linux下如何查看哪些进程占用的CPU内存资源最多
    shell脚本 在后台执行de 命令 >> 文件 2>&1 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)
    ef linq 访问视图返回结果重复
    asp.net core web 本地iis开发
    jQuery控制TR显示隐藏
    mvc EF 从数据库更新实体,添加视图实体时添加不上的问题
    无法确定依赖操作的有效顺序。由于外键约束、模型要求或存储生成的值,因此可能存在依赖关系
    还原差异备份——因为没有文件可用于前滚
  • 原文地址:https://www.cnblogs.com/feixuefubing/p/11064765.html
Copyright © 2011-2022 走看看