【Java开发】Spring Cloud 11 :Gateway 配置 ssl 证书(https、http 访问)

news2024/11/17 21:45:03

最近研究给微服务项目配置 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.2 支持 https 或 http 访问

① 证书移到 resources 目录

② yml 文件中配置 ssl 证书

③ IsSecure 配置


1 SSL/TLS 证书

1.1 介绍

SSL/TLS证书是一种数字证书,用于通过SSL/TLS协议对网站进行加密和认证。它是在客户端和服务器之间建立安全连接的一种方式,以确保数据在传输过程中被加密和保护。SSL/TLS证书包含了一些信息,如证书持有人的名称、证书颁发机构的名称、证书有效期、公钥等等。

其中,公钥是证书中最重要的信息之一。它用于加密数据并将其发送到服务器,而只有服务器上的私钥才能解密这些数据。证书的颁发机构会对证书持有人进行身份验证,并在验证成功后签发证书,以确保证书的可靠性和安全性。

SSL/TLS证书可以分为三种类型:DV(域名验证)证书、OV(组织验证)证书和EV(增强验证)证书。DV证书只验证域名所有权,OV证书进行了更严格的身份验证,而EV证书则需要进行更加深入的身份验证,以确保证书持有人的身份和组织的真实性。

HTTPS协议

简单来说,HTTPS协议 = HTTP协议 + SSL/TLS协议,在进行HTTPS数据传输时,需要使用SSL/TLS对数据进行加密和解密,同时使用HTTP协议对加密后的数据进行传输。

HTTPS协议的目的就是提高传输安全等级,如保护账号、密码、在线交易记录等敏感信息

📌 通信过程

  1. 客户端向服务器发起 HTTPS 请求,连接到服务器的指定端口(一般是443);
  2. 服务器端存在公钥服务器端私钥,用于非对称加密,服务器将公钥发送给客户端;
  3. 客户端收到服务器端发送的证书后,验证其合法性,若公钥合格,那么客户端会生成客户端密钥(client key、随机值),然后将公钥客户端密钥非对称加密成密文(包含请求信息),HTTPS 中的第一次 HTTP 请求结束。
  4. 客户端发起 HTTPS 中的第二个 HTTP 请求,将加密后的密文发送给服务器。
  5. 服务器端收到密文后,使用私钥对其进行非对称解密,解密后获取客户端密钥,此时服务器端判定 https 访问正确,使用公钥客户端密钥继续非对称加密成密文(包含返回信息),然后将该密文发送给客户端。
  6. 客户端收到密文后,使用客户端密钥对其进行解密,获得服务器端发送的真实数据。如此,HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成。

总之 SSL/TLS 证书是为 https 请求服务的,可以简单将其理解为 https 请求的重要媒介,以此来保证请求的安全性和准确性。

1.2 证书申请

SSL/TLS 证书由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。

📌 申请步骤

  1. 选择SSL证书类型:根据您的网站和业务需求,选择适合的SSL证书类型,如DV SSL、OV SSL、EV SSL等。
  2. 验证域名所有权:您需要验证您拥有该域名的所有权,一般有两种方式:DNS验证和文件验证。DNS验证需要在域名的DNS记录中添加一条特定的TXT记录,文件验证需要在您的网站根目录中放置一个特定的文件。
  3. 提交SSL证书申请:选择SSL证书品牌和证书期限,填写相关信息并提交SSL证书申请。
  4. 审核和颁发SSL证书:SSL证书申请提交后,证书颁发机构会对您的申请进行审核,审核通过后会颁发SSL证书,并将证书文件发送给您。
  5. 安装SSL证书:根据您的服务器类型和操作系统,按照证书颁发机构提供的安装指南安装SSL证书。

阿里云、腾讯云、华为云等平台都可以申请,不过无论使用哪种方式,申请SSL证书前,您需要先进行域名验证,确保您拥有该域名的所有权或管理权。验证方式有多种,包括DNS验证、文件验证、邮箱验证等。

以下是申请成功的阿里云免费ssl证书:

1.3 证书类型及选择

点击上图中的下载按钮,有诸多类型的证书供选择👇

乍一看会有点懵,到底自己的项目该如何选择呢?

如果是 Spring Boot 项目的话,可选择红框内的这两项,首先因为 Spring Boot 默认的 web 服务容器是 Tomcat;然后 JKS 由 JDK 支持,而 Spring Boot 又是以 JDK(Java Development Kit)为基础。其余证书就看服务器类型了~

我选择了JKS,下载解压后有两个文件,分别是 .jks 后缀和 .txt 后缀的 👇

2 Gateway 网关配置 ssl 证书

前言讲了 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

2.1 支持 https 访问

第一种情况,微服务项目只支持 https 访问,也就是该微服务只支持客户端进行 https 报错,若进行 http 访问则会报错。若项目适用较为简单,可使用该方式。

① 证书移到 resources 目录

首先将证书移到 Gateway 项目的 resources 目录下,供项目读取 👇

② yml 文件中配置 ssl 证书

下边的 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 后端。

2.2 支持 https 和 http 访问

有时现实情况又是灵活的,需要项目同时适配 http 访问和 https 访问,那么就需要再多两步操作,类似于重定向。

① 证书移到 resources 目录

② yml 文件中配置 ssl 证书

server:
  port: 443 #https端口,可指定
  # 配置SSL 证书
  ssl:
    key-store : classpath:xxxx.com.jks #ssl文件名称
    key-store-password : xxxx #ssl文件密码
    key-store-type: JKS
    enabled: true

③ http 端口设置:

也是在 yml 文件中配置

http:
  port: 8080 #可指定

④ HttpServer.java

编写该文件以实现用过通过 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();
    }

}

至此配置完成。

2.2 支持 https 或 http 访问

有时微服务中的某个项目可能只需要实行 http 访问,而不需要进行 https 访问,可进行如下配置:

① 证书移到 resources 目录

② yml 文件中配置 ssl 证书

server:
  port: 443 #https端口,可指定
  # 配置SSL 证书
  ssl:
    key-store : classpath:xxxx.com.jks #ssl文件名称
    key-store-password : xxxx #ssl文件密码
    key-store-type: JKS
    enabled: true

③ IsSecure 配置

配置中的 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

参考文章:

SpringCloud Gateway网关配置 后端微服务支持http和https调用

springboot安装ssl证书

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/485783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高性能定时器--时间轮/多级时间轮

运行原理 指针指向轮子上的一个槽,轮子以恒定的速度顺时针转动,每转动一步就指向下一个槽(虚线指针指向的槽),每次转动称为一个tick,一个tick的时间称为时间轮的槽间隔slot interval,即心搏时间…

3。数据结构(2)

嵌入式软件开发第三部分,各类常用的数据结构及扩展,良好的数据结构选择是保证程序稳定运行的关键,(1)部分包括数组,链表,栈,队列。(2)部分包括树,…

JavaWeb_Web前端_Element组件库

JavaWeb_Web前端_Element组件库 快速入门安装ElementUI组件库引入ElementUI组件库添加组件并导入到根组件添加组件导入到根组件 Table 表格Pagination 分页Dialog对话框表单 案例Vue路由Vue类DeptView.vue动态视图组件请求链接组件 打包和部署打包打包按钮打包文件 部署部署静态…

OpenAI文本生成器-OpenAI文本生成器

openai自动批量写文章 如果您正在寻找一个能够自动生成高质量文章的工具,OpenAI 写文章就是您需要的推广神器。 OpenAI 写文章基于 OpenAI 最先进的语言模型技术,可以使用自然语言生成技术自动创作文章。只需在平台上提供少量的关键词或概念&#xff0…

Python每日一练:最长递增区间狄杰斯特拉(80分)K树(0分)

文章目录 前言一、最长递增区间二、狄杰斯特拉(80)三、K树(0)总结 前言 很显然,Python的受众远远大于C,其实笔者本人对Python的理解也是远强于C的,C纯粹是为了假装笔者是个职业选手才随便玩玩的…

java基础入门-04

Java基础入门-04 11、集合&学生管理系统11.1.ArrayList集合和数组的优势对比:11.1.1 ArrayList类概述11.1.2 ArrayList类常用方法11.1.2.1 构造方法11.1.2.2 成员方法11.1.2.3 示例代码 11.1.3 ArrayList存储字符串并遍历11.1.3.1 案例需求11.1.3.2 代码实现 11…

基于野火F407骄阳开发板的苹果采摘机器人机械臂的采摘轨迹与夹持器的采摘动作的设计(1)

基于野火F407骄阳开发板的苹果采摘机器人机械臂的采摘轨迹与夹持器的采摘动作的设计(1) 苹果采摘机器人1、采摘流程与硬件设计2、机械臂驱动以及采摘轨迹设计2.1、台达A2电机驱动实现2.2、机械臂寻找苹果巡逻轨迹 苹果采摘机器人 1、采摘流程与硬件设计…

fio 使用碰到的坑,一些不常用,但可能用到的参数(校验 跳跃 多线程)

1, 祼盘读写 一个分区 -filename/dev/sdb1 同时测试多个分区 -filename/dev/sdb1;/dev/sdb2 比例: fio -filename/dev/sdb1 -direct1 -iodepth 1 -thread -rwrandread -ioenginepsync -bs4k -size50G -numjobs10 -runtime1000 -group_reporting -nam…

es6的语法糖,展开运算符,类的实现

1.0 ES6语法糖 [重点] 1.1数组的解构赋值 // 声明多个变量 let [a,b,c] [1,2,3] ​ let a1,b2; // 交换数值 [a,b] [b,a] ​2 1.12 函数的参数结构 1.2对象的解构 对象存在键值对,如果需要解构对象,你需要使用对象的键名为变量…

Flask 知识点整理

文章目录 1.URL与视图的映射带参数的url:将参数固定到了path中查询字符串的方式传参 2.模板渲染给html文件传参 3.模板访问对象属性User 是个类User是个字典 4.过滤器的使用通过一个 | 管道符进行过滤自定义过滤器 5.控制语句iffor 1.URL与视图的映射 带参数的url&…

IIC总线简介

IIC总线 IIC总线是Philips公司在八十年代初推出的一种串行、半双工总线 主要用于近距离、低速的芯片之间的通信;IIC总线有两根双向的信号线一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步;IIC总线硬件结构简单,成…

第9章 项目成本管理

文章目录 9.1.1 成本与成本管理概念 329项目成本管理的过程 9.1.2 相关术语 331成本的类型(6种)应急储备与管理储备 9.2.3 项目成本管理计划制订的 输出 3349.3.1 项目成本估算的主要相关因素 335项目估算还需要考虑但 容易被忽视的 主要因素 9.3.2 项目…

贪心 题目集

任务安排问题 某个系统中有一个设备,该设备每次只能分配给一个任务使用,且只有当任务结束后才能再分配给另一个任务使用。 假设系统启动时间计为时间0点,预先有一份任务计划表,预定了每个任务的开始时间点和持续时间。 要求设计算…

[大二下]手把手1小时下载Pandoc

老规矩先给各位友友们提供参考解决方法,再说为啥是怎么和这哥们结缘的~ 为了能更加详细,小卓又卸载了重装了一遍!!! 所以麻烦各位佬, 能给个赞, 谢谢各位佬了,坦诚的说,因为友友们免费的点赞收藏,却是我写下去的动力~ 第一步:进入官网(如果没有科学上网的可能比较慢, 如果真的…

腾讯云 Ubuntu Desktop 22.04 桌面版

安装 Ubuntu Server 22.04 安装 Ubuntu Server 22.04重置登陆密码, 默认用户名 ubuntu 添加用户 不建议直接使用默认用户, 添加用户(demodeom) sudo adduser demodeom将 demodeom 添加到 sudoer 文件 sudo visudo在文件末尾添…

2023五一赶制个人系统:基于SpringBoot+MyBatisPlus+Vue+ElementUI前后端分离

小钊记前言 🍑一、背景🍑二、调研准备阶段🍊2.1、项目-自己搭建🍓 搭建步骤 🍊2.2、项目需求-自己X造🍊2.2、数据模型设计 🍑三、开发阶段🍑四、renxiaozhao 1.0.0-alpha发布&#x…

BPMN2.0 任务-服务任务

服务任务是任务的一种,工作由软件自动完成,比如一个Web服务或者一个自动化的应用。 服务任务用于调用服务。 在flowable中分为java服务任务,用于调用java类,web服务任务用于同步的调用外部的web服务。 在Camunda是通过调用java代码或者为外部执行者提供一个工作单元来完…

真题详解(ICMP)-软件设计(六十五)

真题详解(对象)-软件设计(六十四)https://blog.csdn.net/ke1ying/article/details/130459425 程序的三种基本控制结构:顺序、选择和重复。 在网络系统中,通常吧_____置于DMZ区。 答案:Web服务器 解析&am…

STL常用梳理——VECTOR常用接口及其迭代器实现

Vector篇 Vector介绍Vector实现1、定义默认构造函数使用实现 2、迭代器Iterator迭代器使用 3、空间增长问题使用实现 迭代器迭代器介绍迭代器实现 Vector介绍 vector是STL中容器之一,特性如下: vector是表示可变大小数组的序列容器。就像数组一样&#…

【python入门篇】你好python

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: Python入门,本专栏主要内容为Python的基础语法,Python中的选择循环语句…