最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java SSLContext創(chuàng)建方式

 更新時(shí)間:2024年01月23日 10:09:29   作者:shuxiaohua  
這篇文章主要介紹了java SSLContext創(chuàng)建方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

概述

HTTPS相對于HTTP多了SSL(security sock layer),應(yīng)用層將數(shù)據(jù)丟給TCP時(shí),需要經(jīng)過SSL層的加密處理;TCP層的數(shù)據(jù)丟給應(yīng)用層時(shí),需要經(jīng)過SSL層的解密處理。

因此網(wǎng)絡(luò)中傳輸?shù)亩际羌用芎蟮臄?shù)據(jù),提高的通信的安全性。

HTTPS除了擁有傳輸加密的功能,還提供身份認(rèn)證,防止對端偽造身份。這個(gè)是通過HTTPS證書實(shí)現(xiàn)。

注下圖中對HTTPS握手過程進(jìn)行簡化,握手過程的關(guān)鍵步驟就是證書校驗(yàn)及對稱加密秘鑰的協(xié)商,另外客戶端證書的校驗(yàn)是可選的。

問題

標(biāo)準(zhǔn)證書都是第三方機(jī)構(gòu)頒發(fā)的,需要付費(fèi)找第三方機(jī)構(gòu)申請。有些出于節(jié)省成本或者省事的目的,一般會使用工具生成自簽名的證書。

瀏覽器訪問這種自簽名證書的網(wǎng)址時(shí)就會彈出不安全的提示,如果是java代碼訪問這種網(wǎng)址時(shí)就會拋出異常。

解決這種問題有2個(gè)途徑,一種是忽略證書認(rèn)證,另一種就是將自簽名的證書添加到受信證書庫中。

SSLContext關(guān)鍵參數(shù)說明

SSLContext都是通過SSLContext.getInstance(String protocol)方法獲取,獲取后需要調(diào)用init方法初始化。

init方法簽名如下:

public final void init(KeyManager[] km, TrustManager[] tm,SecureRandom random)

KeyManager

  • 用于HTTPS雙向認(rèn)證時(shí),客戶端向服務(wù)端發(fā)送的認(rèn)證信息(證書);與不同的服務(wù)端交互時(shí),客戶端可能用不同的身份(證書),所以需要KeyManager進(jìn)行管理。
  • 如果只是單向認(rèn)證,KeyManager[]可以為空。

TrustManager

  • 用于客戶端檢測服務(wù)端發(fā)送過來的證書。

KeyStore:只是單純的存儲證書、秘鑰數(shù)據(jù),不包含任何邏輯。

TrustManager,KeyManager可以使用KeyStore得到證書列表進(jìn)行相應(yīng)的業(yè)務(wù)處理。

忽略證書認(rèn)證

有些語言比如Python是可以修改全局配置去忽略證書檢查,但是Java好像沒有提供這種功能,所以需要覆寫證書認(rèn)證的類X509TrustManager 。

忽略證書認(rèn)證后,雙方通信的時(shí)候仍然是加密的,只是無法對服務(wù)端的身份進(jìn)行認(rèn)證,有服務(wù)端偽造的風(fēng)險(xiǎn)。如果都是在內(nèi)網(wǎng),可以采用這種簡潔的手法。

public SSLContext buildSSLContext() throws Exception {
    X509TrustManager x509TrustManager = new X509TrustManager() {
        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }
        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }
        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[0];
        }
    };
    SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
    sslContext.init((KeyManager[]) null, new X509TrustManager[] {x509TrustManager}, (SecureRandom) null);
    return sslContext;
}

將自簽名證書放到受信證書庫

將證書直接導(dǎo)入到JDK的證書庫

待續(xù)

通過編碼的方式將證書放到受信證書列表中

@Override
public SSLContext buildSSLContext() throws Exception {
    KeyStore keyStore = buildKeyStore();
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(keyStore);
    SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
    sslContext.init((KeyManager[]) null, tmf.getTrustManagers(), (SecureRandom) null);
    return sslContext;
}

private KeyStore buildKeyStore() throws Exception {
    // 獲取自簽名的證書
    List<X509Certificate> certs = loadHttpsCerts();
    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    keyStore.load(null, null);
    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
            TrustManagerFactory.getDefaultAlgorithm());
    trustManagerFactory.init((KeyStore) null);
    // 獲得jdk證書庫中的證書
    Arrays.stream(trustManagerFactory.getTrustManagers())
            .filter(manager -> manager instanceof X509TrustManager)
            .findFirst()
            .ifPresent(manager -> {
                List<X509Certificate> jdkCerts = Arrays.asList(((X509TrustManager) manager).getAcceptedIssuers());
                certs.addAll(jdkCerts);
            });
    certs.stream().forEach(cert -> {
            keyStore.setCertificateEntry(cert.getSubjectDN().getName(), cert);
    });
    return keyStore;
}

private List<X509Certificate> loadHttpsCerts() throws IOException, CertificateException {
    List<X509Certificate> certs = new ArrayList<>(32);
    PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
    Resource[] resources = resolver.getResources(HTTPS_CERTS_PATH);
    for (Resource resource : resources) {
        InputStream inStream = resource.getInputStream();
        CertificateFactory factory = CertificateFactory.getInstance("X.509");
        X509Certificate cert = (X509Certificate) factory.generateCertificate(inStream);
        certs.add(cert);
    }
    return certs; 
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。 

相關(guān)文章

  • Java去掉小數(shù)點(diǎn)后面無效0的方案與建議

    Java去掉小數(shù)點(diǎn)后面無效0的方案與建議

    當(dāng)前小數(shù)點(diǎn)后面的位數(shù)過多的時(shí)候,多余的0沒有實(shí)際意義,下面這篇文章主要給大家介紹了關(guān)于Java去掉小數(shù)點(diǎn)后面無效0的方案與建議,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • Java基礎(chǔ)之面向?qū)ο髾C(jī)制(多態(tài)、繼承)底層實(shí)現(xiàn)

    Java基礎(chǔ)之面向?qū)ο髾C(jī)制(多態(tài)、繼承)底層實(shí)現(xiàn)

    這篇文章主要介紹了Java基礎(chǔ)之面向?qū)ο髾C(jī)制(多態(tài)、繼承)底層實(shí)現(xiàn),文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • SpringBoot如何集成Kaptcha驗(yàn)證碼

    SpringBoot如何集成Kaptcha驗(yàn)證碼

    本文介紹了如何在Java開發(fā)中使用Kaptcha生成驗(yàn)證碼的功能,包括在pom.xml中配置依賴、在系統(tǒng)公共配置類中添加配置、在控制器中添加生成驗(yàn)證碼的方法,以及前端頁面如何引用,同時(shí),還補(bǔ)充了Kaptcha的更多配置屬性及其默認(rèn)值
    2025-01-01
  • SpringBoot集成極光推送完整實(shí)現(xiàn)代碼

    SpringBoot集成極光推送完整實(shí)現(xiàn)代碼

    本文主要介紹了SpringBoot集成極光推送完整實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Windows 下安裝配置 Eclipse詳細(xì)教程

    Windows 下安裝配置 Eclipse詳細(xì)教程

    Eclipse是一款非常優(yōu)秀的開源IDE,非常適合Java開發(fā),由于支持插件技術(shù),受到了越來越多的開發(fā)者的歡迎。配合眾多令人眼花繚亂的插件,完全可以滿足從企業(yè)級Java應(yīng)用到手機(jī)終端Java游戲的開發(fā)。本文將帶您手把手步入Eclipse的廣闊天地
    2016-09-09
  • idea引包導(dǎo)包為灰色如何解決

    idea引包導(dǎo)包為灰色如何解決

    這篇文章主要介紹了idea引包導(dǎo)包為灰色的問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • java中sleep方法和wait方法的五個(gè)區(qū)別

    java中sleep方法和wait方法的五個(gè)區(qū)別

    這篇文章主要介紹了java中sleep方法和wait方法的五個(gè)區(qū)別,sleep?方法和?wait?方法都是用來將線程進(jìn)入休眠狀態(tài),但是又有一些區(qū)別,下面我們就一起來看看吧
    2022-05-05
  • SpringBoot起步依賴和自動配置基本介紹

    SpringBoot起步依賴和自動配置基本介紹

    這篇文章主要介紹了SpringBoot起步依賴和自動配置,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • 解析Java設(shè)計(jì)模式編程中命令模式的使用

    解析Java設(shè)計(jì)模式編程中命令模式的使用

    這篇文章主要介紹了Java設(shè)計(jì)模式編程中命令模式的使用,在一些處理請求響應(yīng)的場合經(jīng)??梢杂玫矫钅J降木幊趟悸?需要的朋友可以參考下
    2016-02-02
  • Spring之IOC詳解

    Spring之IOC詳解

    本文主要介紹了Spring中的IOC的相關(guān)知識。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03

最新評論

禄丰县| 永吉县| 兴国县| 武汉市| 芦山县| 垦利县| 越西县| 闵行区| 博乐市| 合肥市| 始兴县| 思南县| 扎赉特旗| 稻城县| 娄底市| 依安县| 西华县| 城固县| 高安市| 重庆市| 石河子市| 绍兴县| 浑源县| 延庆县| 特克斯县| 新营市| 陕西省| 永嘉县| 石河子市| 西昌市| 岳普湖县| 琼海市| 准格尔旗| 乌兰县| 株洲县| 林周县| 齐齐哈尔市| 五家渠市| 汤原县| 佳木斯市| 沁阳市|