最近研究给微服务项目配置 ssl 证书,如此才可以对接微信小程序(需要使用 https 请求)。传统单体项目来说,首先往项目中添加证书文件,然后在配置文件中配置 ssl 证书路径、密码等相关信息;那么微服务这么多项目,总不能一个个配置 ssl 证书,最后发现可以直接通过网关 Gateway 解决该问题,完全不用对微服务下的项目做变动,亲测有效。
目录
1 SSL/TLS 证书
1.1 介绍
HTTPS协议
1.2 证书申请
1.3 证书类型及选择
2 Gateway 网关配置 ssl 证书
2.1 支持 https 访问
① 证书移到 resources 目录
② yml 文件中配置 ssl 证书
2.2 支持 https 和 http 访问
① 证书移到 resources 目录
② yml 文件中配置 ssl 证书
③ http 端口设置:
④ HttpServer.java
2.3 支持 https 或 http 访问
① 证书移到 resources 目录
② yml 文件中配置 ssl 证书
③ IsSecure 配置
2.4 服务器域名访问
① https+域名+端口访问
② http+域名+端口访问
SSL/TLS证书是一种数字证书,用于通过SSL/TLS协议对网站进行加密和认证。它是在客户端和服务器之间建立安全连接的一种方式,以确保数据在传输过程中被加密和保护。SSL/TLS证书包含了一些信息,如证书持有人的名称、证书颁发机构的名称、证书有效期、公钥等等。
其中,公钥是证书中最重要的信息之一。它用于加密数据并将其发送到服务器,而只有服务器上的私钥才能解密这些数据。证书的颁发机构会对证书持有人进行身份验证,并在验证成功后签发证书,以确保证书的可靠性和安全性。
SSL/TLS证书可以分为三种类型:DV(域名验证)证书、OV(组织验证)证书和EV(增强验证)证书。DV证书只验证域名所有权,OV证书进行了更严格的身份验证,而EV证书则需要进行更加深入的身份验证,以确保证书持有人的身份和组织的真实性。
简单来说,HTTPS协议 = HTTP协议 + SSL/TLS协议,在进行HTTPS数据传输时,需要使用SSL/TLS对数据进行加密和解密,同时使用HTTP协议对加密后的数据进行传输。
HTTPS协议的目的就是提高传输安全等级,如保护账号、密码、在线交易记录等敏感信息
📌 通信过程
总之 SSL/TLS 证书是为 https 请求服务的,可以简单将其理解为 https 请求的重要媒介,以此来保证请求的安全性和准确性。
SSL/TLS 证书由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。
📌 申请步骤
阿里云、腾讯云、华为云等平台都可以申请,不过无论使用哪种方式,申请SSL证书前,您需要先进行域名验证,确保您拥有该域名的所有权或管理权。验证方式有多种,包括DNS验证、文件验证、邮箱验证等。
以下是申请成功的阿里云免费ssl证书:
点击上图中的下载按钮,有诸多类型的证书供选择👇
乍一看会有点懵,到底自己的项目该如何选择呢?
如果是 Spring Boot 项目的话,可选择红框内的这两项,首先因为 Spring Boot 默认的 web 服务容器是 Tomcat;然后 JKS 由 JDK 支持,而 Spring Boot 又是以 JDK(Java Development Kit)为基础。其余证书就看服务器类型了~
我选择了JKS,下载解压后有两个文件,分别是 .jks 后缀和 .txt 后缀的 👇
前言讲了 spring boot 单体项目配置 ssl 证书的流程,其实 Gateway 配置方式类似,虽然 Gateway 本身不是 spring boot 框架(spring-cloud-starter-gateway 与 spring boot 冲突),但是 Gateway 也是属于 spring 框架的,而 spring 框架支持配置 ssl 证书,因此可完成该配置。
背景:SpringBoot版本:2.4.2,SpringCloud版本:2020.0.1
第一种情况,微服务项目只支持 https 访问,也就是该微服务只支持客户端进行 https 报错,若进行 http 访问则会报错。若项目适用较为简单,可使用该方式。
首先将证书移到 Gateway 项目的 resources 目录下,供项目读取 👇
下边的 443 并不是说固定的,可进行指定,这也是 gateway 网关的访问端口。如果该项目需要部署到服务器上,那你需要开放该指定端口,那么客户端才能进行访问。
server: port: 443 #https端口,可指定 # 配置SSL 证书 ssl: key-store : classpath:xxxx.com.jks #ssl文件名称 key-store-password : xxxx #ssl文件密码 key-store-type: JKS enabled: true
至此配置完成,可以说和单体项目的配置别无二致。
注意:此时其他微服务项目是没有配置 ssl 证书的,你的 https 访问流程(请求时将 http 改为 https 即可)如下:https访问 -> 网关 -> 代理到 http 后端。
有时现实情况又是灵活的,需要项目同时适配 http 访问和 https 访问,那么就需要再多两步操作,类似于重定向。
server: port: 443 #https端口,可指定 # 配置SSL 证书 ssl: key-store : classpath:xxxx.com.jks #ssl文件名称 key-store-password : xxxx #ssl文件密码 key-store-type: JKS enabled: true
也是在 yml 文件中配置
http: port: 8080 #可指定
编写该文件以实现用过通过 8080 端口访问即可绕过 https 验证,从而模拟 http 访问。
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory; import org.springframework.boot.web.server.WebServer; import org.springframework.context.annotation.Configuration; import org.springframework.http.server.reactive.HttpHandler; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; @Configuration public class HttpServer { @Autowired private HttpHandler httpHandler; private WebServer webServer; @Value("${http.port}") private Integer httpPort; @PostConstruct public void start() { NettyReactiveWebServerFactory factory = new NettyReactiveWebServerFactory(httpPort); WebServer webServer = factory.getWebServer(httpHandler); webServer.start(); } @PreDestroy public void stop() { webServer.stop(); } }
至此配置完成。
有时微服务中的某个项目可能只需要实行 http 访问,而不需要进行 https 访问,可进行如下配置:
server: port: 443 #https端口,可指定 # 配置SSL 证书 ssl: key-store : classpath:xxxx.com.jks #ssl文件名称 key-store-password : xxxx #ssl文件密码 key-store-type: JKS enabled: true
配置中的 service-demo 为服务名称,只需要配置不同服务对应的 IsSecure 值即可支持对应服务的访问方式。
#网关路由配置 spring: cloud: gateway: filter: routes: - id: service-demo uri: lb://service-demo predicates: - Path=/service-demo/** filters: - StripPrefix=1 #设置路由转发以https方式转发,true则以https方式转发false以http方式转发 service-demo: ribbon: IsSecure: true
前提是该服务器与域名已经绑定,同时服务器已开放这两个端口(如果使用 docker ,注意启动项目容器时开放两个端口),那么给 gateway 配置的 ssl 证书就会配合域名生效。就算服务器与域名绑定了,但是项目没有配置 ssl 证书,那么进行域名访问也是不成功的。当然,将域名换成ip地址也是完全可以进行访问的。
参考文章:
SpringCloud Gateway网关配置 后端微服务支持http和https调用
springboot安装ssl证书