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

java SSLContext創(chuàng)建方式

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

概述

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

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

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

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

問題

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

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

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

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雙向認證時,客戶端向服務端發(fā)送的認證信息(證書);與不同的服務端交互時,客戶端可能用不同的身份(證書),所以需要KeyManager進行管理。
  • 如果只是單向認證,KeyManager[]可以為空。

TrustManager

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

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

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

忽略證書認證

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

忽略證書認證后,雙方通信的時候仍然是加密的,只是無法對服務端的身份進行認證,有服務端偽造的風險。如果都是在內(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;
}

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

將證書直接導入到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é)

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

相關(guān)文章

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

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

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

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

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

    SpringBoot如何集成Kaptcha驗證碼

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

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

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

    Windows 下安裝配置 Eclipse詳細教程

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

    idea引包導包為灰色如何解決

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

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

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

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

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

    解析Java設計模式編程中命令模式的使用

    這篇文章主要介紹了Java設計模式編程中命令模式的使用,在一些處理請求響應的場合經(jīng)常可以用到命令模式的編程思路,需要的朋友可以參考下
    2016-02-02
  • Spring之IOC詳解

    Spring之IOC詳解

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

最新評論

历史| 丽水市| 周至县| 报价| 隆化县| 木兰县| 洞头县| 资溪县| 开阳县| 山东省| 八宿县| 陕西省| 泸州市| 滕州市| 阿巴嘎旗| 兰西县| 琼中| 武山县| 大关县| 沂水县| 灵石县| 禄丰县| 五常市| 舟曲县| 美姑县| 威海市| 高清| 灵川县| 循化| 嘉禾县| 股票| 安阳市| 台东县| 宁乡县| 莎车县| 商河县| 德庆县| 嘉荫县| 云梦县| 保定市| 松阳县|