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

springboot基于keytool實(shí)現(xiàn)https的雙向認(rèn)證示例教程

 更新時(shí)間:2023年06月28日 11:52:51   作者:佐氵諳  
這篇文章主要介紹了springboot基于keytool實(shí)現(xiàn)https的雙向認(rèn)證,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、環(huán)境準(zhǔn)備

服務(wù)器信息如下:

操作系統(tǒng)說(shuō)明
server-one服務(wù)器1
server-two服務(wù)器2

二、keytool命令解釋

-genkey 表示要?jiǎng)?chuàng)建一個(gè)新的密鑰。 
-alias 表示 keystore 的別名。 
-keyalg 表示使用的加密算法是 RSA ,一種非對(duì)稱加密算法。 
-keysize 表示密鑰的長(zhǎng)度。 
-keystore 表示生成的密鑰存放位置。 
-validity 表示密鑰的有效時(shí)間,單位為天。

-keypass 私鑰訪問(wèn)密碼:123456

-storepass keystone文件訪問(wèn)密碼:123456

刪除導(dǎo)入的信任證書(shū)

keytool -delete -alias 刪除證書(shū)的別名 -keystore 信任庫(kù)
keytool -delete -alias server-one -keystore /home/keytool/trustKeys.p12

三、服務(wù)器server-one生成密鑰 服務(wù)器

1生成TrustStore(信任庫(kù).P12)

keytool -genkey -alias trustkeys -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore /home/keytool/trustKeys.p12 -validity 36500

服務(wù)器1生成客戶端密鑰(.P12)

keytool -genkey -alias server-one -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore /home/keytool/server-one.p12 -validity 36500

服務(wù)器1導(dǎo)出客戶端公鑰(.cer)

keytool -keystore /home/keytool/server-one.p12 -export -alias server-one -file /home/keytool/server-one-publicKey.cer

添加客戶端(服務(wù)器2)公鑰到服務(wù)器1的信任庫(kù)(雙向認(rèn)證需要操作此步驟)

keytool -import -alias server-two -v -file /home/keytool/server-two-publicKey.cer -keystore /home/keytool/trustKeys.p12

從服務(wù)器1生成客戶端密鑰(.P12)文件中導(dǎo)出私鑰文件(.key)

openssl pkcs12 -in /home/keytool/server-one.p12  -nodes -nocerts -out /home/keytool/server-one.key

從服務(wù)器1導(dǎo)出的客戶端公鑰(.cer)文件中導(dǎo)出公鑰文件(.pem)

openssl x509 -inform der -in /home/keytool/server-one-publicKey.cer -out /home/keytool/server-one.pem

四、服務(wù)器server-two生成密鑰(參考服務(wù)器1)

服務(wù)器2生成TrustStore(信任庫(kù).P12)

keytool -genkey -alias trustkeys -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore /home/keytool/trustKeys.p12 -validity 36500

服務(wù)器2生成客戶端密鑰(.P12)

keytool -genkey -alias server-two -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore /home/keytool/server-two.p12 -validity 36500

服務(wù)器2導(dǎo)出客戶端公鑰(.cer)

keytool -keystore /home/keytool/server-two.p12 -export -alias server-one -file /home/keytool/server-two-publicKey.cer

添加客戶端(服務(wù)器1)的公鑰到服務(wù)器2的信任庫(kù)(雙向認(rèn)證需要操作此步驟)

keytool -import -alias server-one -v -file /home/keytool/server-one-publicKey.cer -keystore /home/keytool/trustKeys.p12

從服務(wù)器2生成客戶端密鑰(.P12)文件中導(dǎo)出私鑰文件(.key)

openssl pkcs12 -in /home/keytool/server-two.p12  -nodes -nocerts -out /home/keytool/server-two.key

從服務(wù)器2導(dǎo)出的客戶端公鑰(.cer)文件中導(dǎo)出公鑰文件(.pem)

openssl x509 -inform der -in /home/keytool/server-two-publicKey.cer -out /home/keytool/server-two.pem

 五、配置SpringBoot支持https

1、服務(wù)器1配置文件application.properties

#開(kāi)啟ssl
server.ssl.enabled=true
#配置的值 need雙向驗(yàn)證 none不驗(yàn)證客戶端 want會(huì)驗(yàn)證,但不強(qiáng)制驗(yàn)證,即驗(yàn)證失敗也可以成功建立連接
server.ssl.client-auth=need
#協(xié)議
#server.ssl.protocol=TLS
#服務(wù)通信證書(shū)
server.ssl.key-store=classpath:ssl/server-one.p12
#密鑰密碼
#server.ssl.key-password=123456
#證書(shū)密碼
server.ssl.key-store-password=123456
#證書(shū)格式
server.ssl.key-store-type=PKCS12
#證書(shū)別名
server.ssl.keyAlias=server-one
#信任庫(kù)文件
server.ssl.trust-store=classpath:ice-ca/trustKeys.p12
#信任庫(kù)密碼
server.ssl.trust-store-password=123456
#信任庫(kù)類(lèi)型
server.ssl.trust-store-type=PKCS12

2、服務(wù)器2配置文件application.properties

#開(kāi)啟ssl
server.ssl.enabled=true
#配置的值 need雙向驗(yàn)證 none不驗(yàn)證客戶端 want會(huì)驗(yàn)證,但不強(qiáng)制驗(yàn)證,即驗(yàn)證失敗也可以成功建立連接
server.ssl.client-auth=need
#協(xié)議
#server.ssl.protocol=TLS
#服務(wù)通信證書(shū)
server.ssl.key-store=classpath:ssl/server-two.p12
#密鑰密碼
#server.ssl.key-password=123456
#證書(shū)密碼
server.ssl.key-store-password=123456
#證書(shū)格式
server.ssl.key-store-type=PKCS12
#證書(shū)別名
server.ssl.keyAlias=server-two
#信任庫(kù)文件
server.ssl.trust-store=classpath:ice-ca/trustKeys.p12
#信任庫(kù)密碼
server.ssl.trust-store-password=123456
#信任庫(kù)類(lèi)型
server.ssl.trust-store-type=PKCS12

3、拷貝相應(yīng)密鑰到resources目錄下

4、pom.xml配置文件添加配置項(xiàng)如下

<resources>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.xml</include>
            <include>ssl/server-one.p12</include>
            <include>ice-ca/trustKeys.p12</include>
        </includes>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
    </resource>
</resources>

六、配置RestTemplate工具類(lèi)

1、pom添加httpclient支持

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.13</version>
        </dependency>

2、設(shè)置RestTemplate支持https請(qǐng)求

import lombok.extern.slf4j.Slf4j;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
import javax.net.ssl.*;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.security.*;
import java.security.cert.CertificateException;
import java.time.Duration;
/**
 * HTTPS通信雙向認(rèn)證工具類(lèi)
 *
 * @author xiwh
 */
@Configuration
@Slf4j
public class RestTemplateConfig {
    @Value("${server.ssl.key-store-type}")
    String clientKeyType;
    @Value("${server.ssl.key-store}")
    String clientPath;
    @Value("${server.ssl.key-store-password}")
    String clientPass;
    @Value("${server.ssl.trust-store-type}")
    String trustKeyType;
    @Value("${server.ssl.trust-store}")
    String trustPath;
    @Value("${server.ssl.trust-store-password}")
    String trustPass;
    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = null;
        try {
            HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
            // 客戶端證書(shū)類(lèi)型
            KeyStore clientStore = KeyStore.getInstance(clientKeyType);
            // 加載客戶端證書(shū),即自己的私鑰
            InputStream keyStream = getClass().getClassLoader().getResourceAsStream(clientPath);
            clientStore.load(keyStream, clientPass.toCharArray());
            // 創(chuàng)建密鑰管理工廠實(shí)例
            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
            // 初始化客戶端密鑰庫(kù)
            keyManagerFactory.init(clientStore, clientPass.toCharArray());
            KeyManager[] keyManagers = keyManagerFactory.getKeyManagers();
            // 創(chuàng)建信任庫(kù)管理工廠實(shí)例
            TrustManagerFactory trustManagerFactory = TrustManagerFactory
                    .getInstance(TrustManagerFactory.getDefaultAlgorithm());
            KeyStore trustStore = KeyStore.getInstance(trustKeyType);
            InputStream trustStream = getClass().getClassLoader().getResourceAsStream(trustPath);
            // 加載信任證書(shū)
            trustStore.load(trustStream, trustPass.toCharArray());
            // 初始化信任庫(kù)
            trustManagerFactory.init(trustStore);
            //雙向校驗(yàn) 校驗(yàn)服務(wù)端證書(shū)是否在信任庫(kù)
            TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
            // 建立TLS連接
            SSLContext sslContext = SSLContext.getInstance("TLS");
            // 初始化SSLContext
            sslContext.init(keyManagers, trustManagers, new SecureRandom());
            // INSTANCE 忽略域名檢查
            SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
            // 創(chuàng)建httpClient對(duì)象
            CloseableHttpClient httpclient = HttpClients
                    .custom()
                    .setSSLSocketFactory(sslConnectionSocketFactory)
                    .setSSLHostnameVerifier(new NoopHostnameVerifier())
                    .build();
            requestFactory.setHttpClient(httpclient);
            requestFactory.setConnectTimeout((int) Duration.ofSeconds(15).toMillis());
            restTemplate = new RestTemplate(requestFactory);
        } catch (KeyManagementException | FileNotFoundException | NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyStoreException | CertificateException | UnrecoverableKeyException | IOException e) {
            e.printStackTrace();
        }
        return restTemplate;
    }
}

3、測(cè)試代碼

服務(wù)器1(server-one)請(qǐng)求接口代碼

    @Test
    public void testHttps() {
        String url = "https://127.0.0.1:8077/httpsTest";
        ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class);
        System.out.println(forEntity.toString());
    }

服務(wù)器2(server-two)controller代碼

    /**
     * https測(cè)試方法
     *
     * @return
     */
    @ApiOperation("https測(cè)試方法")
    @GetMapping("/httpsTest")
    public Result httpsTest() {
        log.info("服務(wù)器server-two響應(yīng)成功!");
        return Result.SUCCESS();
    }

服務(wù)器2(server-two)執(zhí)行結(jié)果

<200,{"code":1,"success":true,"msg":"操作成功","data":null}>

七、Nginx配置ssl證書(shū)

 
    server  {
    #監(jiān)聽(tīng)前端訪問(wèn)端口
    listen       9028 ssl;
    #服務(wù)器地址
    server_name  47.104.239.238;
    charset utf-8;
    client_max_body_size 20M;
    #雙向認(rèn)證 開(kāi)啟校驗(yàn)客戶端
    #ssl_verify_client on;
    #server公鑰 或 阿里云證書(shū) 一般是crt文件
    ssl_certificate         /home/keytool/server.pem;
    #server私鑰 或 阿里云證書(shū) 一般是key文件
    ssl_certificate_key     /home/keytool/server.key;
    #雙向認(rèn)證 客戶端公鑰
    #ssl_client_certificate  /home/keytool/server.pem;
    #支持ssl協(xié)議版本
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    #配置服務(wù)器可使用的加密算法
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    # 指定服務(wù)器密碼算法在優(yōu)先于客戶端密碼算法時(shí),使用 SSLv3 和 TLS 協(xié)議
    ssl_prefer_server_ciphers on;
    ssl_session_timeout 5m;
    #前端請(qǐng)求后端接口
    location  /prod-api/ {
    proxy_pass https://47.104.239.238:8077/;
    proxy_set_header Host $proxy_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Nginx-Proxt true;
    proxy_set_header HTTP_X_FORWORDED_FOR $remote_addr;
    proxy_ssl_certificate     /home/keytool/server.pem;
    proxy_ssl_certificate_key /home/keytool/server.key;
    proxy_ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 SSLv2 SSLv3 ;
    proxy_ssl_ciphers         ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    proxy_ssl_session_reuse  off;
    proxy_ssl_server_name on;
    proxy_redirect off;
  }
    #前端包目錄
    location / {
    root   /mnt/project/sinotmemc/dist;
    try_files $uri $uri/ /index.html;
    index  index.html index.htm;
  }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    root   html;
  }
  }

參考資料:

spring boot 使用RestTemplate通過(guò)證書(shū)認(rèn)證訪問(wèn)https實(shí)現(xiàn)SSL請(qǐng)求

到此這篇關(guān)于springboot基于keytool實(shí)現(xiàn)https的雙向認(rèn)證的文章就介紹到這了,更多相關(guān)springboot https雙向認(rèn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在IntelliJ?IDEA中配置Git過(guò)程

    在IntelliJ?IDEA中配置Git過(guò)程

    本文介紹了在IntelliJ?IDEA中配置Git的全過(guò)程,包括安裝Git、在IDEA中配置Git路徑以及在項(xiàng)目中啟用Git,具體步驟分為三步:安裝Git,配置IDEA中的Git路徑,并在項(xiàng)目中啟用Git,最后,還介紹了基本操作與進(jìn)階配置,如提交代碼、推送/拉取代碼、設(shè)置Git用戶名等
    2026-04-04
  • SpringCloud的Hystrix簡(jiǎn)單介紹

    SpringCloud的Hystrix簡(jiǎn)單介紹

    這篇文章主要介紹了SpringCloud的Hystrix簡(jiǎn)單介紹,SpringCloud Hystrix是Netflix開(kāi)源的一款容錯(cuò)框架,具備服務(wù)降級(jí),服務(wù)熔斷,依賴隔離,監(jiān)控(Hystrix Dashboard)等功能,同樣具有自我保護(hù)能力,需要的朋友可以參考下
    2023-07-07
  • 使用Java實(shí)現(xiàn)PDF填充圖片功能

    使用Java實(shí)現(xiàn)PDF填充圖片功能

    本文介紹了使用Java和iText庫(kù)在PDF文件中填充圖片的方法,包括基本步驟、準(zhǔn)備工作、注意事項(xiàng),以及如何使用ApachePDFBox處理批量圖片并設(shè)置A4紙大小,還提供了性能優(yōu)化建議,如版本兼容性、內(nèi)存管理、流式處理等,需要的朋友可以參考下
    2025-09-09
  • Spark使用IDEA編寫(xiě)wordcount的示例演示

    Spark使用IDEA編寫(xiě)wordcount的示例演示

    這篇文章主要介紹了Spark使用IDEA編寫(xiě)wordcount的示例演示,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • 學(xué)會(huì)在Java中使用Optional功能

    學(xué)會(huì)在Java中使用Optional功能

    這篇文章主要介紹了學(xué)會(huì)在Java中使用Optional功能,在本文中,我們將了解如何、何時(shí)以及在哪里最好地應(yīng)用Optional,具體相關(guān)內(nèi)容需要的朋友可以參考下面文章內(nèi)容
    2022-09-09
  • @Scheduled注解的scheduler屬性作用及說(shuō)明

    @Scheduled注解的scheduler屬性作用及說(shuō)明

    @Scheduled注解用于定義周期性任務(wù),其scheduler屬性允許指定自定義Scheduler,以實(shí)現(xiàn)更靈活的調(diào)度控制,可共享資源、滿足復(fù)雜需求,或使用默認(rèn)ThreadPoolTaskScheduler,通過(guò)配置SchedulerBean并注入,確保調(diào)度器一致性和靈活性
    2026-04-04
  • 聊聊java多線程創(chuàng)建方式及線程安全問(wèn)題

    聊聊java多線程創(chuàng)建方式及線程安全問(wèn)題

    線程被稱為輕量級(jí)進(jìn)程,是程序執(zhí)行的最小單位,它是指在程序執(zhí)行過(guò)程中,能夠執(zhí)行代碼的一個(gè)執(zhí)行單位。接下來(lái)通過(guò)本文給大家介紹java多線程創(chuàng)建方式及線程安全問(wèn)題,感興趣的朋友一起看看吧
    2022-01-01
  • springboot接入deepseek深度求索代碼示例(java版)

    springboot接入deepseek深度求索代碼示例(java版)

    這篇文章主要介紹了springboot接入deepseek深度求索的相關(guān)資料,包括創(chuàng)建APIKey,封裝詢問(wèn)工具方法,傳入問(wèn)題,調(diào)用方法,但發(fā)現(xiàn)只能回答簡(jiǎn)單問(wèn)題,需要的朋友可以參考下
    2025-01-01
  • SpringBoot部署和前端連接問(wèn)題解決的完整指南(net::ERR_CONNECTION_REFUSED)

    SpringBoot部署和前端連接問(wèn)題解決的完整指南(net::ERR_CONNECTION_REFUSED)

    在開(kāi)發(fā)和部署 Spring Boot 應(yīng)用時(shí),可能會(huì)遇到各種問(wèn)題,例如 JAR 文件無(wú)法運(yùn)行、前端無(wú)法連接后端服務(wù)等,本文將詳細(xì)總結(jié)這些問(wèn)題的解決方法,幫助你順利部署和運(yùn)行 Spring Boot 應(yīng)用,需要的朋友可以參考下
    2025-01-01
  • Mybatis-Plus實(shí)現(xiàn)自動(dòng)生成代碼的操作步驟

    Mybatis-Plus實(shí)現(xiàn)自動(dòng)生成代碼的操作步驟

    AutoGenerator 是 MyBatis-Plus 的代碼生成器,通過(guò) AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各個(gè)模塊的代碼,極大的提升了開(kāi)發(fā)效率,本文將給大家介紹Mybatis-Plus實(shí)現(xiàn)自動(dòng)生成代碼的操作步驟
    2023-10-10

最新評(píng)論

若尔盖县| 黎平县| 龙游县| 海伦市| 讷河市| 吉林省| 富平县| 内黄县| 江安县| 乌兰浩特市| 乌恰县| 邢台市| 察雅县| 宾川县| 灵山县| 隆化县| 临高县| 玉林市| 肥乡县| 台前县| 大冶市| 阿坝县| 宜良县| 新泰市| 虹口区| 中宁县| 扎兰屯市| 洛川县| 阿尔山市| 黎平县| 昌图县| 阿瓦提县| 高陵县| 苍山县| 九龙县| 祁连县| 梧州市| 淮安市| 江川县| 镇坪县| 丹寨县|