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

news2024/11/17 0:44:13

最近研究给微服务项目配置 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+域名+端口访问


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.3 支持 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

2.4 服务器域名访问

前提是该服务器与域名已经绑定,同时服务器已开放这两个端口(如果使用 docker ,注意启动项目容器时开放两个端口),那么给 gateway 配置的 ssl 证书就会配合域名生效。就算服务器与域名绑定了,但是项目没有配置 ssl 证书,那么进行域名访问也是不成功的。当然,将域名换成ip地址也是完全可以进行访问的。

① https+域名+端口访问

② http+域名+端口访问

参考文章:

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

springboot安装ssl证书

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

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

相关文章

机器学习强基计划8-5:图解局部线性嵌入LLE算法(附Python实现)

目录 0 写在前面1 流形学习2 局部线性嵌入算法2.1 什么是局部线性嵌入?2.2 算法原理推导 3 Python实现3.1 算法流程3.2 核心代码3.3 可视化 0 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的…

基于学生成绩管理系统(附源代码及数据库)

基于Ecplise,jsp的学生成绩管理系统 目录 登录页面 系统主页 管理员账号管理 学生查询 课程管理 成绩管理 后台数据库 源代码下载(含数据库) 毕设项目专栏 分为以下四大板块: 系统用户管理: 包含管理员账号管理&#…

【一起撸个DL框架】5 实现:自适应线性单元

CSDN个人主页:清风莫追欢迎关注本专栏:《一起撸个DL框架》GitHub获取源码:https://github.com/flying-forever/OurDL 文章目录 5 实现:自适应线性单元🍇1 简介2 损失函数2.1 梯度下降法2.2 补充 3 整理项目结构4 损失函…

第二十七章 Unity碰撞体Collision(下)

本章节我们继续研究碰撞体,并且探索一下碰撞体与刚体之间的联系。我们回到之前的工程,然后给我们的紫色球体Sphere1也添加一个刚体组件。如下所示 此时,两个球体都具备了碰撞体和刚体组件。接下来,我们Play运行查看效果 我们发现&…

第二十六章 Unity碰撞体Collision(上)

在游戏世界中,游戏物体之间的交互都是通过“碰撞接触”来进行交互的。例如,攻击怪物则是主角与怪物的碰撞,触发机关则是主角与机关的碰撞。在DirectX课程中,我们也大致介绍过有关碰撞检测的内容。游戏世界中的3D模型的形状是非常复…

浅谈区块链1.0-比特币

1. 比特币解决的问题 高度自治:国际经济危机无国界贸易:不同国家进行的贸易或者不同平台进行贸易 不可窜改:例如银行交易可能会被窜改数据 隐私安全:传统汇款方式会暴露你的个人信息,一旦数据库被别人入侵&#xff0c…

android基础知识复习

架构: 应用框架层(Java API Framework)所提供的主要组件: 名称功能描述Activity Manager(活动管理器)管理各个应用程序生命周期,以及常用的导航回退功能Location Manager(位置管理器…

SpringBoot整合Mybatis-plus实现多级评论

在本文中,我们将介绍如何使用SpringBoot整合Mybatis-plus实现多级评论功能。同时,本文还将提供数据库的设计和详细的后端代码,前端界面使用Vue2。 数据库设计 本文的多级评论功能将采用MySQL数据库实现,下面是数据库的设计&…

Boonz-KeygenMe#1(★★★)

运行程序 错误: 查壳 没有壳,是汇编写的程序 载入OD 前面是在读取输入内容,到这里开始做计算了 分析 首先遍历了用户名,计算结果保存在EBX,在存放到 0x40E0F8 对EBX中的值再次计算,最后结果保存到 …

JavaFX: Java音乐播放读取歌词

JavaFX: Java音乐播放读取歌词 1、lrc歌词文件2、解析lrc歌词2.1 读取每行歌词2.2 解析歌词时间标签Time-tag2.3 解析歌词标识标签ID-tags2.4 创建对象包含歌词相关信息 3、播放显示歌词** 相关文献 JavaFX: Java音乐播放 1、lrc歌词文件 lrc歌词文件的扩展名 1、标准格式&a…

图像处理:Retinex算法

目录 前言 概念介绍 Retinex算法理论 单尺度Retinex(SSR) 多尺度Retinex(MSR) 多尺度自适应增益Retinex(MSRCR) Opencv实现Retinex算法 SSR算法 MCR算法 MSRCR算法 效果展示 总结 参考文章 前…

基频建模方法总结

基频F0建模方法 语音合成领域需要对基频进行建模,具体到文语转换TTS、语音转换VC、情感语音转换EVC领域等。 语音合成F0 包括文语转换,情感语音转换 TTEF:text-to-emotional-features synthesis EVC:emotional voice conversio…

这些你熟知的 app 和服务,都用上了人工智能

从微软在 Microsoft 365 服务中全面整合 GPT-4 能力 ,让 PPT、Word 文档、Excel 表格的制作变成了「一句话的事」,到 Adobe 刚刚发布 Adobe Firefly模型集合,让图形设计、字体风格、视频渲染乃至 3D 建模的门槛显著降低——你我熟知的那些工…

idea的快捷键

一.idea的快捷键: 递进选择&#xff1a;ctrl w复制行&#xff1a;ctrl d删除行&#xff1a;ctrl y大小写切换&#xff1a;ctrl shift u展开/折叠&#xff1a;ctrl shift 减号/加号向前/向后&#xff1a;ctrl <— / —>Live Template(例如 输入psvm会自动打出mai…

华为OD机试题,用 Java 解【最远足迹】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不要…

Python实战项目:手势识别控制电脑音量

今天给大家带来一个OpenCV的实战小项目——手势识别控制电脑音量 先上个效果图&#xff1a; 通过大拇指和食指间的开合距离来调节电脑音量&#xff0c;即通过识别大拇指与食指这两个关键点之间的距离来控制电脑音量大小 技术交流 技术要学会分享、交流&#xff0c;不建议闭…

石英晶体振荡器【Multisim】【高频电子线路】

目录 一、实验目的与要求 二、实验仪器 三、实验内容与测试结果 1、观察输出波形&#xff0c;测量振荡频率和输出电压幅度 2、测量静态工作点的变化范围(IEQmin~IEQmax) 3、测量当静态工作点在上述范围时输出频率和输出电压的变化 4、测量负载变化对振荡频率和输出电压幅…

SpringCloud:微服务保护之初识Sentinel

1.初识Sentinel Sentinel是阿里巴巴开源的一款微服务流量控制组件。Sentinel官网 Sentinel具有以下特征&#xff1a; 丰富的应用场景&#xff1a;Sentinel承接了阿里巴巴近 10 年的双十一大促流量的核心场景&#xff0c;例如秒杀&#xff08;即突发流量控制在系统容量可以承受…

JavaEE阶段测试复习

文章全部内容在个人站点内的置顶文章中,访问密码:AIIT 小凯的宝库 模块三、面向对象 继承: a. 单继承:Java只支持单继承,即一个子类只能有一个直接父类。但子类可以间接地继承多个父类。 b. 构造方法与继承:在子类中可以通过super()关键字调用父类的构造方法。如果子类没…

探索深度学习中的计算图:PyTorch的动态图解析

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…