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

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

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

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

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

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

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

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

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 中實現(xiàn)服務(wù)器端 X.509 身份驗證,還需要給我們的服務(wù)端也生成一個證書。

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

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

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

vi conf.config

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

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

然后給服務(wù)端證書簽名,會提示你輸入 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

這條指令會要你先輸入 localhost.key 的密碼,然后再要你定義 localhost.p12 的密碼。 localhost.p12 這個密碼一定要記住,因為在 Spring 的配置文件中有用到。

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

Spring Boot開啟https

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

修改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ā)機構(gòu) 導(dǎo)入 rootCA.crt

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

創(chuàng)建信托證書

信托證書中會存有 信任的外部實體的證書

這里我們只要將 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 添加到項目中,并修改配置文件

application.properties添加:

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

注意:此時由于添加了server.ssl.client-auth=need,因為沒有添加個人證書,所以這個時候刷新頁面,項目會無法訪問,如果想要同時兼任普通登錄,可以將need改成want,但是want只會在第一次訪問頁面時才會向客戶索取個人證書

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

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

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

在生成客戶端證書時,那些信息不建議跳過,因為在后續(xù)的步驟中,會獲取其中的信息用以登錄。比如我在 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 選擇 個人證書shurlormes.p12 導(dǎo)入,期間會要你輸入它的密碼。

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

Spring Boot獲取個人證書信息

恭喜你,到了這一步, 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("個人證書信息:" + 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 同時開啟http和https

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

要同時開啟 httpshttp ,只需添加一個 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;
  }
}

這時候啟動項目,注意看控制臺打印的信息。

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

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

上面我們已經(jīng)可以同時訪問 htt p和 https ,但如果我要訪問 http 的時候,自動跳轉(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文件添加到項目resources后,記得rebuild項目,否則target的classes中沒有生成證書文件,會導(dǎo)致項目啟動失敗。
  • application.properties中的server.ssl.keyAlias需要和生成p12文件的-name一致,否則也會導(dǎo)致項目無法啟動。
  • 如果要指定域名,需要修改conf.confg中的DNS.1,否則瀏覽器會提示網(wǎng)站不安全。

代碼地址

https://github.com/Shurlormes/pkilogin

參考資料

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

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

相關(guān)文章

  • 最最常用的 100 個 Java類分享

    最最常用的 100 個 Java類分享

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

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

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

    Java全排列算法字典序下的下一個排列講解

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

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

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

    Java中的異常處理機制try-catch詳解

    這篇文章主要介紹了Java中的異常處理機制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實現(xiàn)快速處理圖片

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

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

    Jenkins中自動化部署Spring?Boot項目的全過程

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

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

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

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

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

最新評論

西宁市| 黎平县| 古交市| 额济纳旗| 广饶县| 遂宁市| 武乡县| 庆阳市| 宿松县| 乐至县| 连平县| 陇南市| 四平市| 定安县| 广宗县| 永登县| 玉树县| 东明县| 湘阴县| 南昌市| 德阳市| 宁乡县| 林口县| 广平县| 横山县| 达州市| 青岛市| 元阳县| 临汾市| 海口市| 成武县| 石林| 万宁市| 公安县| 河曲县| 洞口县| 长寿区| 平安县| 凤庆县| 定兴县| 于都县|