Springboot中基于X509完成SSL檢驗的原理與實現(xiàn)
前言
各位對HTTPS
不陌生吧?幾乎涉及安全的領(lǐng)域,均要求通過HTTPS協(xié)議進(jìn)行數(shù)據(jù)傳輸。而在傳輸過程中,又涉及到了SSL證書的使用。既然提到了SSL證書
,那咱們先了解了解什么是SSL證書
:
SSL證書通過在客戶端瀏覽器和Web服務(wù)器之間建立一條SSL安全通道(
Secure socket layerSSL
,安全套接層)安全協(xié)議是由Netscape Communication公司設(shè)計開發(fā)。該安全協(xié)議主要用來提供對用戶和服務(wù)器的認(rèn)證;對傳送的數(shù)據(jù)進(jìn)行加密和隱藏;確保數(shù)據(jù)在傳送中不被改變,即數(shù)據(jù)的完整性,現(xiàn)已成為該領(lǐng)域中全球化的標(biāo)準(zhǔn)。——百度百科
簡單講,是一個連接客戶與服務(wù)之間的“安全通道”
。通過它,我們可以確保數(shù)據(jù)的完整性、保密性,實現(xiàn)防泄露,防篡改等安全目的。
一、SSL原理
因為SSL證書可以滿足絕大多數(shù)場景的數(shù)據(jù)傳輸安全,所以越來越多的數(shù)據(jù)廠商或者云服務(wù)商皆提供了免費(fèi)的SSL證書服務(wù)。當(dāng)然也有收費(fèi)的(推薦
),畢竟數(shù)據(jù)安全永遠(yuǎn)是第一位的,“不怕一萬,只怕萬一”
。
1. 底層交互圖
2. 重要術(shù)語
術(shù)語 | 作用 |
---|---|
CA(Certificate Authority,證書授權(quán)) | 一般理解為證書的服務(wù)機(jī)構(gòu)。 負(fù)責(zé)證書簽發(fā)、審核等。 |
Server | 使用證書的服務(wù)方 |
Client | 使用證書的客戶方 |
一句話總結(jié)
:CA
向Server
簽發(fā)一個有效的證書,當(dāng)Client請求Server時,先會收到一個證書,Client基于此證書完成核驗并協(xié)商下一步數(shù)據(jù)的傳輸。
二、SSL驗證基礎(chǔ)
1. X.509簡介
X.509
是密碼學(xué)里公鑰證書的格式標(biāo)準(zhǔn)。 X.509 證書己應(yīng)用在包括TLS/SSL
(WWW萬維網(wǎng)安全瀏覽的基石)在內(nèi)的眾多 Internet協(xié)議里。同時它也用在很多非在線應(yīng)用場景里,比如電子簽名服務(wù)。X.509
證書里含有公鑰、身份信息(比如網(wǎng)絡(luò)主機(jī)名,組織的名稱或個體名稱等)和簽名信息(可以是證書簽發(fā)機(jī)構(gòu)CA的簽名,也可以是自簽名)。對于一份經(jīng)由可信的證書簽發(fā)機(jī)構(gòu)簽名或者可以通過其它方式驗證的證書,證書的擁有者就可以用證書及相應(yīng)的私鑰來創(chuàng)建安全的通信,對文檔進(jìn)行數(shù)字簽名。另外除了證書本身功能,X.509還附帶了證書吊銷列表和用于從最終對證書進(jìn)行簽名的證書簽發(fā)機(jī)構(gòu)直到最終可信點(diǎn)為止的證書合法性驗證算法。X.509
是ITU-T標(biāo)準(zhǔn)化部門基于他們之前的ASN.1定義的一套證書標(biāo)準(zhǔn)。
一句話總結(jié)
:X.509是一個證書規(guī)范和標(biāo)準(zhǔn),據(jù)此我們可以完成相應(yīng)的證書簽發(fā)、核驗等操作。
2. Java核心類
2.1 javax.net.ssl.SSLContext
根據(jù)javadoc
可SSLContext
是SSL協(xié)議的封裝類。
解釋:此類的實例表示安全套接字協(xié)議的實現(xiàn),它充當(dāng)用于安全套接字工廠或 SSLEngine 的工廠。用可選的一組密鑰和信任管理器及安全隨機(jī)字節(jié)源初始化此類。
2.2 java.security.cert.X509Certificate
根據(jù)javadoc
可知X509Certificate
是SSL證書的封裝類。
解釋
:X.509 是證書的抽象類。此類提供了一種訪問 X.509 v1 證書所有屬性的標(biāo)準(zhǔn)方式。無法通過此接口提供專用于 X.509 v2 或 v3 的屬性。以后的 API 發(fā)展會提供對全部 X.509 v3 屬性的完全訪問。
基本的 X.509 格式由 ISO/IEC 和 ANSI X9 所定義,用 ASN.1 描述如下:
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signature BIT STRING }這些證書被廣泛使用以支持 Internet 安全系統(tǒng)中的身份驗證和其他功能。常見的應(yīng)用包括增強(qiáng)保密郵件 (PEM)、傳輸層安全 (SSL)、用于受信任軟件發(fā)布的代碼簽名和安全電子交易 (SET)。
由證書頒發(fā)機(jī)構(gòu) (CA) 來管理和擔(dān)保這些證書。CA 的工作是創(chuàng)建證書,方法是將數(shù)據(jù)置于 X.509 標(biāo)準(zhǔn)格式,然后以數(shù)字方式簽署該數(shù)據(jù)。CA 充當(dāng)受信任的第三方,在不能直接通信的主體之間傳遞信息。CA 證書可由其自身簽名,也可由其他 CA 簽名,如“根”CA。
2.3 javax.net.ssl.X509TrustManager
根據(jù)javadoc
可知X509TrustManager
是SSL證書驗證的“憑據(jù)”
封裝類。
解釋
:TrustManager 負(fù)責(zé)管理做出信任決定時使用的的信任材料,也負(fù)責(zé)決定是否接受同位體提供的憑據(jù)。通過使用 TrustManagerFactory,或?qū)崿F(xiàn) TrustManager 子類之一創(chuàng)建 TrustManager。
三、SSL驗證示例
通過一、二的介紹,我們具備了一定的理論基礎(chǔ)和實踐方向,接下來可以通過一個示例“小試牛刀”
了。且看以下代碼:
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 { // 驗證服務(wù)器證書鏈 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驗證的時候,我們主要關(guān)注服務(wù)端證書的有效性,因此只需對其中的checkServerTrusted
方法進(jìn)行實現(xiàn)。你只需要將以上代碼貼在一個POST請求中,即可完成對服務(wù)端SSL證書的驗證。
結(jié)語
本文對Springboot中如何完成服務(wù)端SSL證書的校驗進(jìn)行了介紹,相關(guān)背景和支持的工具均已闡述并提供。
到此這篇關(guān)于Springboot中基于X509完成SSL檢驗的原理與實現(xiàn)的文章就介紹到這了,更多相關(guān)Springboot X509完成SSL檢驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot如何優(yōu)雅的實現(xiàn)重試功能
這篇文章主要詳細(xì)介紹了SpringBoot如何優(yōu)雅的實現(xiàn)重試功能的步驟詳解,文中有詳細(xì)的代碼示例,具有一定的參考價值,感興趣的同學(xué)可以借鑒閱讀2023-06-06詳解SpringBoot結(jié)合swagger2快速生成簡單的接口文檔
這篇文章主要介紹了詳解SpringBoot結(jié)合swagger2快速生成簡單的接口文檔,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05java獲取ip地址與網(wǎng)絡(luò)接口的方法示例
這篇文章主要給大家介紹了關(guān)于利用java如何獲取ip地址與網(wǎng)絡(luò)接口的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01mybatis-plus 使用Condition拼接Sql語句各方法的用法
這篇文章主要介紹了mybatis-plus 使用Condition拼接Sql語句各方法的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07MyEclipse整合ssh三大框架環(huán)境搭載用戶注冊源碼下載
這篇文章主要為大家詳細(xì)介紹了如何使用MyEclipse整合ssh三大框架進(jìn)行環(huán)境搭載,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10