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

Spring Boot 實(shí)現(xiàn)https ssl免密登錄(X.509 pki登錄)

 更新時(shí)間:2021年01月05日 09:01:30   作者:Shurlormes  
這篇文章主要介紹了Spring Boot 實(shí)現(xiàn)https ssl免密登錄(X.509 pki登錄),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

要讓項(xiàng)目實(shí)現(xiàn) ssl 免密登錄,首先需要開啟 https

所以先從 Spring Boot 如何開啟 https 說起。

創(chuàng)建服務(wù)端證書

為了開啟 https ,我們需要一份證書。

實(shí)際開發(fā)中,會(huì)在網(wǎng)上申請(qǐng)一個(gè)機(jī)構(gòu)頒發(fā)的證書。這里為了方便,我會(huì)使用 openssl 命令自己生成一個(gè)證書來使用。

openssl req -x509 -sha256 -days 3650 -newkey rsa:4096 -keyout rootCA.key -out rootCA.crt

所有的密碼都是 123456 ,然后根據(jù)提示輸入相關(guān)信息就好,如果嫌麻煩也可以直接回車跳過。

這樣我們就得到了證書 rootCA.crt 和私鑰 rootCA.key 。

要在 Spring Boot 中實(shí)現(xiàn)服務(wù)器端 X.509 身份驗(yàn)證,還需要給我們的服務(wù)端也生成一個(gè)證書。

openssl req -new -newkey rsa:4096 -keyout localhost.key -out localhost.csr

同樣,密碼是 123456 ,文件名 localhost 可以自行修改。

接下來就是用 rootCA 給我們的服務(wù)端證書做簽名了,在此之前,我們先寫一個(gè)配置文件,里面寫有一些基本的配置

vi conf.config

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost

其中 DNS.1 的值就是你的域名,比如 www.segmentfault.comlocalhost 等等。如果這里填錯(cuò)了,訪問網(wǎng)站時(shí),瀏覽器會(huì)提示網(wǎng)站不安全。

然后給服務(wù)端證書簽名,會(huì)提示你輸入 rootCA 的密碼

openssl x509 -req -CA rootCA.crt -CAkey rootCA.key -in localhost.csr -out localhost.crt -days 365 -CAcreateserial -extfile conf.config

成功后,讓我們查看一下證書的信息

openssl x509 -in localhost.crt -text

最后再將簽名證書和私鑰打包到 PKCS 文件中

openssl pkcs12 -export -out localhost.p12 -name "localhost" -inkey localhost.key -in localhost.crt

這條指令會(huì)要你先輸入 localhost.key 的密碼,然后再要你定義 localhost.p12 的密碼。 localhost.p12 這個(gè)密碼一定要記住,因?yàn)樵?Spring 的配置文件中有用到。

另外需要特別注意的是, Spring 配置文件中 server.ssl.keyAlias 的值,就是命令中的 localhost(-name "localhost") 。

Spring Boot開啟https

localhost.p12 復(fù)制到 resources 目錄下之后編譯項(xiàng)目

修改application.properties文件

server.port=8888
server.ssl.key-store=classpath:localhost.p12
server.ssl.key-store-password=123456
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias=localhost

chrome://settings/security 中,選擇 受信任的根證書頒發(fā)機(jī)構(gòu) 導(dǎo)入 rootCA.crt

這時(shí)啟動(dòng)項(xiàng)目,就可以使用 https 訪問網(wǎng)站了,而且瀏覽器提示網(wǎng)站時(shí)安全的。

創(chuàng)建信托證書

信托證書中會(huì)存有 信任的外部實(shí)體的證書

這里我們只要將 rootCA.crt 添加進(jìn)去就可以了

keytool -import -trustcacerts -noprompt -alias ca -ext san=dns:localhost,ip:127.0.0.1 -file rootCA.crt -keystore localhost.jks

然后將 localhost.jks 添加到項(xiàng)目中,并修改配置文件

application.properties添加:

server.ssl.trust-store=classpath:localhost.jks
server.ssl.trust-store-password=123456
server.ssl.client-auth=need

注意:此時(shí)由于添加了server.ssl.client-auth=need,因?yàn)闆]有添加個(gè)人證書,所以這個(gè)時(shí)候刷新頁(yè)面,項(xiàng)目會(huì)無法訪問,如果想要同時(shí)兼任普通登錄,可以將need改成want,但是want只會(huì)在第一次訪問頁(yè)面時(shí)才會(huì)向客戶索取個(gè)人證書

創(chuàng)建客戶端證書

現(xiàn)在創(chuàng)建一個(gè)客戶端的證書,步驟和服務(wù)端的差不多一樣。

openssl req -new -newkey rsa:4096 -nodes -keyout shurlormes.key -out shurlormes.csr

在生成客戶端證書時(shí),那些信息不建議跳過,因?yàn)樵诤罄m(xù)的步驟中,會(huì)獲取其中的信息用以登錄。比如我在 Common Name 處填寫的信息,就是等下用來登錄的用戶名。

接下來用 RootCA 給客戶端證書簽名

openssl x509 -req -CA rootCA.crt -CAkey rootCA.key -in shurlormes.csr -out shurlormes.crt -days 365 -CAcreateserial

然后再將簽名證書和私鑰打包到 PKCS 文件中

openssl pkcs12 -export -out shurlormes.p12 -name "shurlormes" -inkey shurlormes.key -in shurlormes.crt

最后在 chrome://settings/security 選擇 個(gè)人證書shurlormes.p12 導(dǎo)入,期間會(huì)要你輸入它的密碼。

這時(shí)候刷新頁(yè)面,瀏覽器就會(huì)彈出一個(gè)對(duì)話框,讓你選擇個(gè)人認(rèn)證了。

Spring Boot獲取個(gè)人證書信息

恭喜你,到了這一步, pki 登錄已經(jīng)完成了 99% 了。接下來就是通過 request 獲取證書信息,然后處理字符串,拿到用戶名做登錄即可。

@RequestMapping("/login")
public String login(HttpServletRequest request) {
  X509Certificate[] certs = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");
  if(certs != null) {
    X509Certificate gaX509Cert = certs[0];
    String dn = gaX509Cert.getSubjectDN().toString();
    System.out.println("個(gè)人證書信息:" + dn);
    String username = "";
    String[] dnArray = dn.split(",");
    for (String dnItem : dnArray) {
      String[] dnInfo = dnItem.split("=");
      String key = dnInfo[0];
      String value = dnInfo[1];
      if("cn".equalsIgnoreCase(key.trim())) {
        username = value;
        break;
      }
    }
    System.out.println("用戶名:" + username);

    if(!StringUtils.isEmpty(username)) {
      SecurityContext securityContext = SecurityContextHolder.getContext();
      User userDetails = new User(username, "", Collections.EMPTY_LIST);
      securityContext.setAuthentication(new UsernamePasswordAuthenticationToken(userDetails, "", Collections.EMPTY_LIST));
      return "redirect:/";
    }

  }
  return "login";
}

Spring Boot 同時(shí)開啟http和https

相信大家都發(fā)現(xiàn)了,現(xiàn)在項(xiàng)目只能通過 https 訪問,如果用 http 訪問瀏覽器直接返回 Bad request 了。

要同時(shí)開啟 httpshttp ,只需添加一個(gè) TomcatConfig 就可以

@Configuration
public class TomcatHttpConfig {
  @Bean
  public TomcatServletWebServerFactory servletContainer() {
    TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
    tomcat.addAdditionalTomcatConnectors(initiateHttpConnector());
    return tomcat;
  }

  private Connector initiateHttpConnector() {
    Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
    connector.setScheme("http");
    connector.setPort(9999);
    connector.setSecure(false);
    return connector;
  }
}

這時(shí)候啟動(dòng)項(xiàng)目,注意看控制臺(tái)打印的信息。

說明已經(jīng)成功啟動(dòng) http 在端口 9999 , https8888 ,頁(yè)面也可以成功訪問了。

Spring Boot http自動(dòng)跳轉(zhuǎn)https

上面我們已經(jīng)可以同時(shí)訪問 htt p和 https ,但如果我要訪問 http 的時(shí)候,自動(dòng)跳轉(zhuǎn)的 https 呢?

只需要在上面的基礎(chǔ)上稍微改改就可以了。

@Configuration
public class TomcatHttpConfig {
  @Bean
  public TomcatServletWebServerFactory servletContainer() {
    TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
      @Override
      protected void postProcessContext(Context context) {
        SecurityConstraint securityConstraint = new SecurityConstraint();
        securityConstraint.setUserConstraint("CONFIDENTIAL");
        SecurityCollection collection = new SecurityCollection();
        collection.addPattern("/*");
        securityConstraint.addCollection(collection);
        context.addConstraint(securityConstraint);
      }
    };
    tomcat.addAdditionalTomcatConnectors(initiateHttpConnector());
    return tomcat;
  }

  private Connector initiateHttpConnector() {
    Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
    connector.setScheme("http");
    connector.setPort(9999);
    connector.setSecure(false);
    connector.setRedirectPort(8888);
    return connector;
  }
}

踩坑總結(jié)

  • 把服務(wù)端證書p12文件添加到項(xiàng)目resources后,記得rebuild項(xiàng)目,否則target的classes中沒有生成證書文件,會(huì)導(dǎo)致項(xiàng)目啟動(dòng)失敗。
  • application.properties中的server.ssl.keyAlias需要和生成p12文件的-name一致,否則也會(huì)導(dǎo)致項(xiàng)目無法啟動(dòng)。
  • 如果要指定域名,需要修改conf.confg中的DNS.1,否則瀏覽器會(huì)提示網(wǎng)站不安全。

代碼地址

https://github.com/Shurlormes/pkilogin

參考資料

https://www.baeldung.com/x-509-authentication-in-spring-security

到此這篇關(guān)于Spring Boot 實(shí)現(xiàn)https ssl免密登錄(X.509 pki登錄)的文章就介紹到這了,更多相關(guān)Spring Boot https ssl免密登錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 最最常用的 100 個(gè) Java類分享

    最最常用的 100 個(gè) Java類分享

    這篇文章主要介紹了最最常用的 100 個(gè) Java類分享,需要的朋友可以參考下
    2015-04-04
  • Java源碼深度分析String與StringBuffer及StringBuilder詳解

    Java源碼深度分析String與StringBuffer及StringBuilder詳解

    當(dāng)對(duì)字符串進(jìn)行修改的時(shí)候,需要使用?StringBuffer?和?StringBuilder類,和String類不同的是,StringBuffer和?StringBuilder類的對(duì)象能夠被多次的修改,并且不產(chǎn)生新的未使用對(duì)象,本篇我們來分析分析它們的源碼
    2022-05-05
  • Java全排列算法字典序下的下一個(gè)排列講解

    Java全排列算法字典序下的下一個(gè)排列講解

    今天小編就為大家分享一篇關(guān)于Java全排列字典序下的下一個(gè)排列,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • request如何獲取完整url(包括域名、端口、參數(shù))

    request如何獲取完整url(包括域名、端口、參數(shù))

    這篇文章主要介紹了request如何獲取完整url(包括域名、端口、參數(shù))問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java中的異常處理機(jī)制try-catch詳解

    Java中的異常處理機(jī)制try-catch詳解

    這篇文章主要介紹了Java中的異常處理機(jī)制try-catch詳解,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • 開發(fā)10年,全記在這本Java進(jìn)階寶典里了

    開發(fā)10年,全記在這本Java進(jìn)階寶典里了

    這篇文章主要給大家分享介紹了這本Java進(jìn)階寶典里,是開發(fā)10年總結(jié)出來的,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧
    2019-04-04
  • Java使用Thumbnailator實(shí)現(xiàn)快速處理圖片

    Java使用Thumbnailator實(shí)現(xiàn)快速處理圖片

    它提供了簡(jiǎn)單易用的API,可以輕松地生成縮略圖并進(jìn)行各種操作,Thumbnailator是一個(gè)Java庫(kù),用于創(chuàng)建和操作圖像縮略圖,下面我們就來看看具體的操作吧
    2025-04-04
  • Jenkins中自動(dòng)化部署Spring?Boot項(xiàng)目的全過程

    Jenkins中自動(dòng)化部署Spring?Boot項(xiàng)目的全過程

    這篇文章主要介紹了如何使用Jenkins從Git倉(cāng)庫(kù)拉取SpringBoot項(xiàng)目并進(jìn)行自動(dòng)化部署,通過配置Jenkins任務(wù),實(shí)現(xiàn)項(xiàng)目的構(gòu)建、鏡像構(gòu)建和容器運(yùn)行,確保項(xiàng)目在更新時(shí)自動(dòng)部署,需要的朋友可以參考下
    2025-01-01
  • spring cloud學(xué)習(xí)教程之config修改配置詳解

    spring cloud學(xué)習(xí)教程之config修改配置詳解

    這篇文章主要給大家介紹了關(guān)于spring cloud學(xué)習(xí)教程之config修改配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • 從零搭建Spring Boot腳手架整合OSS作為文件服務(wù)器的詳細(xì)教程

    從零搭建Spring Boot腳手架整合OSS作為文件服務(wù)器的詳細(xì)教程

    這篇文章主要介紹了從零搭建Spring Boot腳手架整合OSS作為文件服務(wù)器的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評(píng)論

磐安县| 石家庄市| 乌海市| 常山县| 黎城县| 灌阳县| 西平县| 阳东县| 孟州市| 班玛县| 贵港市| 武定县| 保定市| 长春市| 上高县| 沭阳县| 昔阳县| 福安市| 建昌县| 怀柔区| 汉源县| 泗洪县| 微博| 新绛县| 西乡县| 团风县| 隆回县| 蕲春县| 托克托县| 微博| 益阳市| 门头沟区| 柳州市| 聊城市| 宝丰县| 玉树县| 漳平市| 江北区| 中牟县| 迭部县| 建昌县|