Springboot中基于X509完成SSL检验的原理与实现

 更新时间:2024年09月18日 15:07:40   作者:一叶飞舟  
本文详细解析了HTTPS通信中SSL证书的作用和原理,SSL证书建立在客户端和服务器之间的安全通道,确保数据传输的完整性和保密性,详细的介绍了Springboot中基于X509完成SSL检验的原理与实现,感兴趣的可以了解一下

前言

各位对HTTPS不陌生吧?几乎涉及安全的领域,均要求通过HTTPS协议进行数据传输。而在传输过程中,又涉及到了SSL证书的使用。既然提到了SSL证书,那咱们先了解了解什么是SSL证书

SSL证书通过在客户端浏览器和Web服务器之间建立一条SSL安全通道(Secure socket layerSSL,安全套接层)安全协议是由Netscape Communication公司设计开发。该安全协议主要用来提供对用户和服务器的认证;对传送的数据进行加密和隐藏;确保数据在传送中不被改变,即数据的完整性,现已成为该领域中全球化的标准。——百度百科

简单讲,是一个连接客户与服务之间的“安全通道”。通过它,我们可以确保数据的完整性、保密性,实现防泄露,防篡改等安全目的。

一、SSL原理

因为SSL证书可以满足绝大多数场景的数据传输安全,所以越来越多的数据厂商或者云服务商皆提供了免费的SSL证书服务。当然也有收费的(推荐),毕竟数据安全永远是第一位的,“不怕一万,只怕万一”

1. 底层交互图

在这里插入图片描述

2. 重要术语

术语作用
CA(Certificate Authority,证书授权)一般理解为证书的服务机构。 负责证书签发、审核等。
Server使用证书的服务方
Client使用证书的客户方

一句话总结CAServer签发一个有效的证书,当Client请求Server时,先会收到一个证书,Client基于此证书完成核验并协商下一步数据的传输。

二、SSL验证基础

1. X.509简介

X.509 是密码学里公钥证书的格式标准。 X.509 证书己应用在包括TLS/SSL(WWW万维网安全浏览的基石)在内的众多 Internet协议里。同时它也用在很多非在线应用场景里,比如电子签名服务。
X.509证书里含有公钥、身份信息(比如网络主机名,组织的名称或个体名称等)和签名信息(可以是证书签发机构CA的签名,也可以是自签名)。对于一份经由可信的证书签发机构签名或者可以通过其它方式验证的证书,证书的拥有者就可以用证书及相应的私钥来创建安全的通信,对文档进行数字签名。另外除了证书本身功能,X.509还附带了证书吊销列表和用于从最终对证书进行签名的证书签发机构直到最终可信点为止的证书合法性验证算法。
X.509是ITU-T标准化部门基于他们之前的ASN.1定义的一套证书标准。

一句话总结:X.509是一个证书规范和标准,据此我们可以完成相应的证书签发、核验等操作。

2. Java核心类

2.1 javax.net.ssl.SSLContext

根据javadocSSLContext是SSL协议的封装类。

在这里插入图片描述

解释:此类的实例表示安全套接字协议的实现,它充当用于安全套接字工厂或 SSLEngine 的工厂。用可选的一组密钥和信任管理器及安全随机字节源初始化此类。

2.2 java.security.cert.X509Certificate

根据javadoc可知X509Certificate是SSL证书的封装类。

在这里插入图片描述

解释:X.509 是证书的抽象类。此类提供了一种访问 X.509 v1 证书所有属性的标准方式。无法通过此接口提供专用于 X.509 v2 或 v3 的属性。以后的 API 发展会提供对全部 X.509 v3 属性的完全访问。
基本的 X.509 格式由 ISO/IEC 和 ANSI X9 所定义,用 ASN.1 描述如下:
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signature BIT STRING }
这些证书被广泛使用以支持 Internet 安全系统中的身份验证和其他功能。常见的应用包括增强保密邮件 (PEM)、传输层安全 (SSL)、用于受信任软件发布的代码签名和安全电子交易 (SET)。
由证书颁发机构 (CA) 来管理和担保这些证书。CA 的工作是创建证书,方法是将数据置于 X.509 标准格式,然后以数字方式签署该数据。CA 充当受信任的第三方,在不能直接通信的主体之间传递信息。CA 证书可由其自身签名,也可由其他 CA 签名,如“根”CA。

2.3 javax.net.ssl.X509TrustManager

根据javadoc可知X509TrustManager是SSL证书验证的“凭据”封装类。

在这里插入图片描述

解释:TrustManager 负责管理做出信任决定时使用的的信任材料,也负责决定是否接受同位体提供的凭据。通过使用 TrustManagerFactory,或实现 TrustManager 子类之一创建 TrustManager。

三、SSL验证示例

通过一、二的介绍,我们具备了一定的理论基础实践方向,接下来可以通过一个示例“小试牛刀”了。且看以下代码:

SSLContext sc = SSLContext.getInstance("ssl");
sc.init(null, new TrustManager[] { new X509TrustManager() {

	@Override
	public X509Certificate[] getAcceptedIssuers() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
		// 验证服务器证书链
        TrustManagerFactory trustManagerFactory;
		try {
			trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
			trustManagerFactory.init((KeyStore) null);
			TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
			
			for (TrustManager trustManager : trustManagers) {
				if (trustManager instanceof X509TrustManager) {
					((X509TrustManager) trustManager).checkServerTrusted(chain, authType);
					return;
				}
			}
		} catch (NoSuchAlgorithmException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (KeyStoreException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        throw new CertificateException("验证证书失败,请核查!");
	}

	@Override
	public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
		// TODO Auto-generated method stub

	}
} }, new java.security.SecureRandom());

在对SSL验证的时候,我们主要关注服务端证书的有效性,因此只需对其中的checkServerTrusted方法进行实现。你只需要将以上代码贴在一个POST请求中,即可完成对服务端SSL证书的验证。

结语

本文对Springboot中如何完成服务端SSL证书的校验进行了介绍,相关背景和支持的工具均已阐述并提供。

到此这篇关于Springboot中基于X509完成SSL检验的原理与实现的文章就介绍到这了,更多相关Springboot X509完成SSL检验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Java编写简单的Excel工具类

    基于Java编写简单的Excel工具类

    这篇文章主要为大家详细介绍了如何基于Java编写简单的Excel工具类,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考下
    2024-02-02
  • Java实现ECDSA签名算法

    Java实现ECDSA签名算法

    这篇文章主要介绍了Java实现ECDSA签名算法,帮助大家更好得利用Java实现机器学习算法,感兴趣的朋友可以了解下
    2020-10-10
  • Springboot @RequestBody注解踩坑记录

    Springboot @RequestBody注解踩坑记录

    这篇文章主要介绍了Springboot @RequestBody注解踩坑记录,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java多线程之Interrupt中断线程详解

    Java多线程之Interrupt中断线程详解

    Interrupt 的其作用是"中断"线程, 但实际上线程仍会继续运行, 这是一个非常容易混淆的概念. Interrupt 的真正作用是给线程对象设置一个中断标记, 并不会影响线程的正常运行,需要的朋友可以参考下
    2021-05-05
  • springboot与springmvc基础入门讲解

    springboot与springmvc基础入门讲解

    本篇文章主要介绍了详解快速搭建Spring Boot+Spring MVC,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-07-07
  • Java 多线程同步 锁机制与synchronized深入解析

    Java 多线程同步 锁机制与synchronized深入解析

    从尺寸上讲,同步代码块比同步方法小。你可以把同步代码块看成是没上锁房间里的一块用带锁的屏风隔开的空间
    2013-09-09
  • java application maven项目打自定义zip包实例(推荐)

    java application maven项目打自定义zip包实例(推荐)

    下面小编就为大家带来一篇java application maven项目打自定义zip包实例(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • SpringCloud集成Sleuth和Zipkin的思路讲解

    SpringCloud集成Sleuth和Zipkin的思路讲解

    Zipkin 是 Twitter 的一个开源项目,它基于 Google Dapper 实现,它致力于收集服务的定时数据,以及解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现,这篇文章主要介绍了SpringCloud集成Sleuth和Zipkin,需要的朋友可以参考下
    2022-11-11
  • java打印正弦曲线示例

    java打印正弦曲线示例

    这篇文章主要介绍了java数组排序示例,需要的朋友可以参考下
    2014-03-03
  • SpringBoot读取资源目录中JSON文件的方法实例

    SpringBoot读取资源目录中JSON文件的方法实例

    最近做项目遇到需要将json类型的配置文件引用到项目中,已经将读取json文件的方法封装成工具类,下面这篇文章主要给大家介绍了关于SpringBoot读取资源目录中JSON文件的相关资料,需要的朋友可以参考下
    2023-04-04

最新评论