很久不写了,因为一直没有一个项目的需求推动,担心写的东西可能不是太实际。其间学习的事倒是做了不少,设计模式、领域开发、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报文。

真——Springcloud支持Https的更多相关文章

  1. android httpClient 支持HTTPS的2种处理方式

    摘自: http://www.kankanews.com/ICkengine/archives/9634.shtml 项目中Android https或http请求地址重定向为HTTPS的地址,相信很 ...

  2. https大势已来?看腾讯专家如何在高并发压测中支持https

    WeTest 导读 用epoll编写一个高并发网络程序是很常见的任务,但在epoll中加入ssl层的支持则是一个不常见的场景.腾讯WeTest服务器压力测产品,在用户反馈中收到了不少支持https协议 ...

  3. 【转】让Xcode支持iOS12.0 设备真机测试(不断更新真机支持包)Xcode 真机测试 iOS

    最新支持12.0 (16A366)! 所有真机包都是同一大版本号向下兼容.例如12.0 Beta6的真机包,是可以兼容12.0 Beta2及Beta1的. 12.0 (16A366)正式版可用!所有低 ...

  4. iOS app 支持HTTPS iOS开发者相关

    2016年12月21日更新开发者中心链接https://developer.apple.com/news/?id=12212016b该链接是苹果昨天刚在官网给的正式回复 如下: App Transpo ...

  5. node如何让一个端口同时支持https与http

    众所周知node是一个高性能的web服务器,使用它可以很简单的创建一个http或https的服务器. 比如一个很简单的http服务器: var http = require('http'); var ...

  6. 如何让你的网站支持https

    如何让你的网站支持https 当今世界的主流网站基本都是使用https对外界提供服务,甚至有某些公司建议完全使用https, 那么https是什么呢?请参考如下的图解,https是在我们通常说的tcp ...

  7. 让你的网站免费支持 HTTPS 及 Nginx 平滑升级

    为什么要使用 HTTPS ? 首先来说一下 HTTP 与 HTTPS 协议的区别吧,他们的根本区别就是 HTTPS 在 HTTP 协议的基础上加入了 SSL 层,在传输层对网络连接进行加密.简单点说在 ...

  8. 在iOS APP中使用H5显示百度地图时如何支持HTTPS?

    现象: 公司正在开发一个iOSAPP,使用h5显示百度地图,但是发现同样的H5页面,在安卓可以显示出来,在iOS中就显示不出来. 原因分析: 但是现在iOS开发中,苹果已经要求在APP中的所有对外连接 ...

  9. iOS支持Https

    http://oncenote.com/2014/10/21/Security-1-HTTPS/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_s ...

随机推荐

  1. airflow使用本地时区

    ​ 在airflow中使用的时间是utc时间,而更多时候我们希望的是使用本地时间,于是在定义airflow定时任务的时候,涉及到了时间的转换. 1.python中本地时间和utc时间的转换 查看国内可 ...

  2. java必学技能

    一:系统架构师是一个最终确认和评估系统需求,给出开发规范,搭建系统实现的核心构架,并澄清技术细节.扫清主要难点的技术人员.主要着眼于系统的“技术实现”.因此他/她应该是特定的开发平台.语言.工具的大师 ...

  3. Cabloy-CMS:动静结合,解决Hexo痛点问题(进阶篇)

    前言 前一篇文章 介绍了如何通过Cabloy-CMS快速搭建一个博客站点. 这里简单介绍Cabloy-CMS静态站点的渲染机制,更多详细的内容请参见https://cms.cabloy.com 渲染规 ...

  4. 控制执行流程之break和continue

    1.在任何迭代语句的主体部分,都可以用break和continue来控制程序执行流程. 2.注意: break:用于强行退出循环, 不执行循环中剩余的语句:continue:停止当前的循环,执行下一次 ...

  5. JavaScript之深入函数(一)

    在任何编程语言中,函数的功能都是十分强大的,JavaScript也不例外.之前已经讲解了函数的一些基本知识,诸如函数定义,函数执行和函数返回值等,今天就带大家深入了解JavaScript中函数的原理及 ...

  6. ASP.NET Core 3.0 : 二十四. 配置的Options模式

    上一章讲到了配置的用法及内部处理机制,对于配置,ASP.NET Core还提供了一种Options模式.(ASP.NET Core 系列目录) 一.Options的使用 上一章有个配置的绑定的例子,可 ...

  7. 浏览器兼容性知识&测试计划&测试报告

    浏览器兼容性知识&测试计划&测试报告 浏览器兼容性问题:网页或网站兼容性问题,因为不同浏览器使用内核及所支持的HTML(标准通用标记语言下的一个应用)等网页语言标准不同:以及用户客户端 ...

  8. FileDetail

    import org.apache.hadoop.conf.*; import org.apache.hadoop.fs.*; import java.io.IOException; import j ...

  9. Robot Framework自定义测试库的作用域的理解

    robot framework中,强大的测试库api支持,用户可根据实际需求定义测试库,导入后可使用自定义库中相应的关键字. 当自定义的测试库是类库,则需要考虑一个问题:类实例.用类实现的库可以有内部 ...

  10. hadoop之mapreduce详解(优化篇)

    一.概述 优化前我们需要知道hadoop适合干什么活,适合什么场景,在工作中,我们要知道业务是怎样的,能才结合平台资源达到最有优化.除了这些我们当然还要知道mapreduce的执行过程,比如从文件的读 ...