SpringBoot 2.x 配置ssl - 自签证书/信用库

news2024/9/22 9:36:47

文章目录

  • 前言
    • SpringBoot 2.x 配置ssl - 自签证书/信用库
      • 1. yml 配置
      • 2. 当服务器为客户端发送https请求时改造

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


SpringBoot 2.x 配置ssl - 自签证书/信用库

在这里插入图片描述

1. yml 配置

用于配置嵌入式 Tomcat 服务器及其 SSL/TLS 设置

server:
  port: 8088  # 默认端口
  tomcat:
    remote-ip-header: x-forwarded-for
    protocol-header: x-forwarded-proto
    uri-encoding: UTF-8
  ssl:
    key-store: classpath:yzy_service.p12 #服务端的证书
    key-store-password: yzy@yzy
    key-store-type: PKCS12
    key-alias: yzy_service # 指定服务端证书的别名
    trust-store: classpath:rootca.p12 #指向包含可信任客户端证书的信任库
    trust-store-password: changeit
    trust-store-type: PKCS12
    client-auth: need # 启用双向 TLS
  tomcat:
    remote-ip-header: x-forwarded-for
    protocol-header: x-forwarded-proto
    uri-encoding: UTF-8

remote-ip-header: 用于获取客户端的真实 IP 地址。设置为 x-forwarded-for 表示从此头部获取客户端 IP,通常用于负载均衡器或代理服务器的场景。
protocol-header: 用于获取原始协议(HTTP 或 HTTPS)。设置为 x-forwarded-proto 表示从此头部获取协议信息。
uri-encoding: 设置 URI 编码格式。这里设置为 UTF-8。

  ssl:
    key-store: classpath:yzy_service.p12 # 服务端的证书
    key-store-password: yzy@yzy
    key-store-type: PKCS12
    key-alias: yzy_service # 指定服务端证书的别名
    trust-store: classpath:rootca.p12 # 指向包含可信任客户端证书的信任库
    trust-store-password: changeit
    trust-store-type: PKCS12
    client-auth: need # 启用双向 TLS

key-store: 指定服务端证书的路径。这里是一个类路径下的 yzy_service.p12 文件,存储服务端的私钥和公钥证书。
key-store-password: 用于访问密钥库的密码。
key-store-type: 指定密钥库类型,这里是 PKCS12。
key-alias: 指定要使用的服务端证书的别名。
trust-store: 指向包含可信任客户端证书的信任库。这里是一个类路径下的 rootca.p12 文件。
trust-store-password: 用于访问信任库的密码。
trust-store-type: 指定信任库类型,这里是 PKCS12。
client-auth: 设置为 need 表示需要客户端认证,即启用双向 TLS。

2. 当服务器为客户端发送https请求时改造

这里以RestTemplate为例子。
改造内容:

  1. 发送https时要带上证书;
  2. 服务端验证的时候将主机验证关闭;

改造代码:

package org.example.config;

import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.example.common.ServerX509TrustHandler;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.http.client.ClientHttpRequest;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import java.io.FileInputStream;
import java.io.InputStream;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.util.function.Supplier;

@Configuration
public class RestTemplateSslConfig {

    @Value("${server.ssl.key-store}")
    private String keyStorePath;

    @Value("${server.ssl.key-store-password}")
    private String keyStorePassword;

    @Value("${server.ssl.trust-store}")
    private String trustStorePath;

    @Value("${server.ssl.trust-store-password}")
    private String trustStorePassword;
    private final ResourceLoader resourceLoader;

    public RestTemplateSslConfig(ResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader;
    }

    @Bean
    public RestTemplate restTemplate() throws Exception {
        Resource keyStoreResource = resourceLoader.getResource(keyStorePath);
        Resource trustStoreResource = resourceLoader.getResource(trustStorePath);
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        try (InputStream keyStoreInputStream = keyStoreResource.getInputStream()) {
            keyStore.load(keyStoreInputStream, keyStorePassword.toCharArray());
        }

        KeyStore trustStore = KeyStore.getInstance("PKCS12");
        try (InputStream trustStoreInputStream = trustStoreResource.getInputStream()) {
            trustStore.load(trustStoreInputStream, trustStorePassword.toCharArray());
        }

        SSLContext sslContext = SSLContextBuilder.create()
                .loadKeyMaterial(keyStore, keyStorePassword.toCharArray())
                .loadTrustMaterial(trustStore, null)
                .build();

        SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);

        CloseableHttpClient httpClient = HttpClients.custom()
                .setSSLSocketFactory(socketFactory)
                .build();

        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);

        return new RestTemplate(factory);
    }
}

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

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

相关文章

通过 WSL 2 在Windows 上挂载 Linux 磁盘

原文查看 曾为了传输或者共享不同系统的文件频繁地在 Windows 和 Linux 系统之间切换,效率过低,所以尝试通过 WSL 2 在Windows 上挂载 Linux 磁盘。 先决条件 需要在Windows 10 2004 及更高版本(Build 19041 及更高版本)或 Win…

Docker简单快速入门

1. 安装Docker 基于 Ubuntu 24.04 LTS 安装Docker 。 # 更新包索引并安装依赖包 sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common# 添加Docker的官方GPG密钥并存储在正确的位置 curl -fsSL https://mirror…

记一次Mycat分库分表实践

一、分库分表 在系统的研发过程中,随着数据量的不断增长,单库单表已无法满足数据的存储需求,此时就需要对数据库进行分库分表操作。 分库分表是随着业务的不断发展,单库单表无法承载整体的数据存储时,采取的一种将整体数据分散存储到不同服务器上的不同数据库中的不同数…

【C++BFS算法】2192. 有向无环图中一个节点的所有祖先

本文涉及知识点 CBFS算法 LeetCode2192. 有向无环图中一个节点的所有祖先 给你一个正整数 n ,它表示一个 有向无环图 中节点的数目,节点编号为 0 到 n - 1 (包括两者)。 给你一个二维整数数组 edges ,其中 edges[i]…

vue3前端开发-小兔鲜项目-产品详情基础数据渲染

vue3前端开发-小兔鲜项目-产品详情基础数据渲染!这一次内容比较多,我们分开写。第一步先完成详情页面的基础数据的渲染。然后再去做一下右侧的热门产品的列表内容。 第一步,还是老规矩,先准备好接口函数。方便我们的页面组件拿到对…

Vue Router基础

Router 的作用是在单页应用(SPA)中将浏览器的URL和用户看到的内容绑定起来。当用户在浏览不同页面时,URL会随之更新,但页面不需要从服务器重新加载。 1 Router 基础 RouterView RouterView 用于渲染当前URL路径对应的路由组件。…

【Linux】-----工具篇(yum介绍)

目录 Ⅰ、是什么? Ⅱ、Linux下安装软件的三种方式 ①源代码安装 ②rpm包安装 ③yum安装 Ⅲ、yum相关操作 1.查看软件包 2.安装软件 3.卸载软件 Ⅳ、yum本地配置 Ⅰ、是什么? yum是包管理器,也就像一个软件下载安装管理的客户端&…

vsftpd搭建FTP服务器 - 虚拟用户

命令记录 $ sudo apt install vsftpd db-util $ sudo nano /etc/vsftpd.conf $ sudo nano /etc/vsftpd/vsftpd-virtual-users.txt $ sudo db_load -T -t hash -f /etc/vsftpd/vsftpd-virtual-users.txt /etc/vsftpd/vsftpd-virtual-users.db ls /etc/vsftpd/vsftpd-virtual-us…

【PHP】系统的登录和注册

一、为什么要学习系统的登录和注册 系统的登录和注册可能存在多种漏洞,这些漏洞可能被恶意攻击者利用,从而对用户的安全和隐私构成威胁。通过学习系统的登录和注册理解整个登录和注册的逻辑方便后续更好站在开发的角度思考问题发现漏洞。以下是一些常见…

基于STM32瑞士军刀--【FreeRTOS开发】学习笔记(一)|| RISC / 底层代码执行步骤 / 汇编指令

本篇文章基于韦东山老师讲课笔记和自己理解编写。 RISC ARM芯片属于精简指令集计算机(RISC:Reduced Instruction Set Computing),它所用的指令比较简单,有如下特点: ① 对内存只有读、写指令 ② 对于数据的运算是在CPU内部实现 …

Cyberchef基础概念之-分叉合并-fork/merge

本文将介绍如何利用cyberchef中的fork和merge操作,通过对数据进行分叉和合并对数据进行分类处理。为读者提供数据处理多种思路,使得读者能够在日常的工作中灵活的应对数据中的不同部分,还原被编码数据的原貌。 fork和merge操作是Cyberchef非…

【odoo17】后端py方法触发右上角提示组件

概要 在前面文章中,有介绍过前端触发的通知服务。 【odoo】右上角的提示(通知服务) 此文章则介绍后端触发方法。 内容 直接上代码:但是前提一定是按钮触发!!!!! def bu…

OZON宠物产品推荐,OZON那些宠物产品卖得好

俄罗斯人在为他们的“毛孩子”(通常指宠物,特别是狗和猫)选择玩具时,同样展现出对多种类型和风格的偏好。结合当前的市场趋势和Ozon等电商平台的热销数据,以下是几款俄罗斯人最喜欢的宠物玩具及其特点: OZ…

C++ 代码实现局域网即时通信功能 (windows 系统 客户端)

本项目使用C实现具备多个客户端和服务器端即时通信聊天功能软件 一:项目内容 使用C实现一个具备多客户端和一个服务器端即时通信功能的聊天软件。 本项目的目的是 学习在windows平台下,进行C网络开发的基本概念:TCP/IP socket通信&#xff0…

西蒙学习法

西蒙学习法 一根筋,挖死坑;会思考,持续不断的思考;会问问题,有深度的问题;一直想一个问题的解决办法; 资料 《世界十大学习方法》之西蒙学习法

数据结构(5.3_3)——由遍历序列构造二叉树

若只给出一棵二叉树的前/中/后/层 序遍历序列中的一种,不能唯一确定一棵二叉树 构造二叉树 前序 中序遍历序列 例: 前序遍历序列:DAEFBCHGI 中序遍历序列:DAEFBCHGI 后序中序遍历序列 层序中序遍历 总结:

贪心算法(五) ----贪心+单调栈,poj-最佳加油方案

力扣316 ---去除重复字母 题目 给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。 示例 1: 输入:s "bcabc&q…

IDEA的pom.xml显示ignored 的解决办法

问题: idea中创建Maven module时,pom.xml出现ignored。 原因: 相同名称的module在之前被创建删除过,IDEA会误以为新的同名文件是之前删除掉的,将这个新的module的pom.xml文件忽略掉显示ignored. 解决: 在…

【Java有关链表OJ题】-- 单链表的逆置、获取链表的中间节点、获取倒数第k个节点、合并两个有序链表

1. 单链表的逆置 思路:通过头插节点来完成单链表的逆置,定义一个cur指向head的下一个节点,curNext记录cur的next节点, 当链表为空,即头节点head为空时,返回null。当链表只有一个head节点时,返…

【MySQL进阶之路 | 高级篇】数据并发问题与四种隔离级别

1. 事务隔离级别 MySQL是一个客户端/服务器架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接之后,就可以称之为一个会话。每个客户端都可以在自己的会话中向服务器发出请求语句,一…