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