成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用Spring Boot實(shí)現(xiàn)https ssl免密登錄

開發(fā) 前端
要讓項(xiàng)目實(shí)現(xiàn) ssl 免密登錄,首先需要開啟 https 。實(shí)際開發(fā)中,會(huì)在網(wǎng)上申請(qǐng)一個(gè)機(jī)構(gòu)頒發(fā)的證書。這里為了方便,我會(huì)使用 openssl 命令自己生成一個(gè)證書來使用。

[[374038]]

 要讓項(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è)證書來使用。

  1. 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è)證書。

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

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

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

  1. vi conf.config 

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

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

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

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

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

  1. openssl x509 -in localhost.crt -text 

 

 

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

  1. 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)目

用Spring Boot實(shí)現(xiàn)https ssl免密登錄

修改application.properties文件

  1. server.port=8888 
  2. server.ssl.key-store=classpath:localhost.p12 
  3. server.ssl.key-store-password=123456 
  4. server.ssl.keyStoreType=PKCS12 
  5. 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í)安全的。

用Spring Boot實(shí)現(xiàn)https ssl免密登錄

 創(chuàng)建信托證書

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

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

  1. 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)目中,并修改配置文件

用Spring Boot實(shí)現(xiàn)https ssl免密登錄

application.properties添加:

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

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

 

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

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

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

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

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

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

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

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

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




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


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

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

  1. @RequestMapping("/login"
  2. public String login(HttpServletRequest request) { 
  3.     X509Certificate[] certs = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate"); 
  4.     if(certs != null) { 
  5.         X509Certificate gaX509Cert = certs[0]; 
  6.         String dn = gaX509Cert.getSubjectDN().toString(); 
  7.         System.out.println("個(gè)人證書信息:" + dn); 
  8.         String username = ""
  9.         String[] dnArray = dn.split(","); 
  10.         for (String dnItem : dnArray) { 
  11.             String[] dnInfo = dnItem.split("="); 
  12.             String key = dnInfo[0]; 
  13.             String value = dnInfo[1]; 
  14.             if("cn".equalsIgnoreCase(key.trim())) { 
  15.                 username = value; 
  16.                 break; 
  17.             } 
  18.         } 
  19.         System.out.println("用戶名:" + username); 
  20.  
  21.         if(!StringUtils.isEmpty(username)) { 
  22.             SecurityContext securityContext = SecurityContextHolder.getContext(); 
  23.             User userDetails = new User(username, "", Collections.EMPTY_LIST); 
  24.             securityContext.setAuthentication(new UsernamePasswordAuthenticationToken(userDetails, "", Collections.EMPTY_LIST)); 
  25.             return "redirect:/"
  26.         } 
  27.  
  28.     } 
  29.     return "login"

 

用Spring Boot實(shí)現(xiàn)https ssl免密登錄

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

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

用Spring Boot實(shí)現(xiàn)https ssl免密登錄

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

  1. @Configuration 
  2. public class TomcatHttpConfig { 
  3.     @Bean 
  4.     public TomcatServletWebServerFactory servletContainer() { 
  5.         TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory(); 
  6.         tomcat.addAdditionalTomcatConnectors(initiateHttpConnector()); 
  7.         return tomcat; 
  8.     } 
  9.  
  10.     private Connector initiateHttpConnector() { 
  11.         Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); 
  12.         connector.setScheme("http"); 
  13.         connector.setPort(9999); 
  14.         connector.setSecure(false); 
  15.         return connector; 
  16.     } 

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

 

 

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


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

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

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

  1. @Configuration 
  2. public class TomcatHttpConfig { 
  3.     @Bean 
  4.     public TomcatServletWebServerFactory servletContainer() { 
  5.         TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() { 
  6.             @Override 
  7.             protected void postProcessContext(Context context) { 
  8.                 SecurityConstraint securityConstraint = new SecurityConstraint(); 
  9.                 securityConstraint.setUserConstraint("CONFIDENTIAL"); 
  10.                 SecurityCollection collection = new SecurityCollection(); 
  11.                 collection.addPattern("/*"); 
  12.                 securityConstraint.addCollection(collection); 
  13.                 context.addConstraint(securityConstraint); 
  14.             } 
  15.         }; 
  16.         tomcat.addAdditionalTomcatConnectors(initiateHttpConnector()); 
  17.         return tomcat; 
  18.     } 
  19.  
  20.     private Connector initiateHttpConnector() { 
  21.         Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); 
  22.         connector.setScheme("http"); 
  23.         connector.setPort(9999); 
  24.         connector.setSecure(false); 
  25.         connector.setRedirectPort(8888); 
  26.         return connector; 
  27.     } 

 踩坑總結(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)站不安全。

 

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2024-10-28 09:38:15

2023-07-27 08:44:49

2023-03-09 08:12:08

免登錄實(shí)Python腳本

2019-10-23 04:37:56

Jschsftp服務(wù)器

2024-06-20 12:35:36

2020-01-30 10:00:44

Linux公鑰私鑰

2022-03-07 09:00:00

HTTPS證書中間件

2022-01-26 07:01:00

開源社區(qū)項(xiàng)目

2019-02-26 09:30:47

AndroidiOS移動(dòng)系統(tǒng)

2025-06-04 04:00:00

Spring掃碼登錄免密認(rèn)證

2024-03-26 12:08:20

加密NginxHTTP

2021-09-30 06:31:12

Spring Boot配置密碼

2015-10-21 11:03:21

ssh登錄Linux

2018-12-18 10:07:41

Spring Boot服務(wù)器HTTP2

2017-09-21 10:02:02

Java網(wǎng)頁爬蟲Httpclient

2018-05-25 16:32:45

Spring BootJava開發(fā)

2016-10-14 14:16:28

Spring BootJava應(yīng)用

2021-07-13 14:05:37

單點(diǎn)登錄頁面

2016-10-24 17:47:38

2021-04-26 08:54:17

Spring BootSecurity防重登錄
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲精品一区二区冲田杏梨 | 色天堂影院 | 欧美 日韩 亚洲91麻豆精品 | 欧美日韩视频在线播放 | 日韩精品久久一区二区三区 | 日韩视频成人 | 久久逼逼 | 一区二区三区电影在线观看 | 国产一区二区激情视频 | 91在线视频免费观看 | 男女羞羞视频免费看 | 中国一级大毛片 | 日韩欧美视频在线 | 久久婷婷av | 91欧美激情一区二区三区成人 | 91精品久久久久久久久中文字幕 | 91免费高清 | 国产 日韩 欧美 中文 在线播放 | 精品在线一区 | 婷婷综合 | 午夜欧美| 欧美日韩亚洲国产 | 国产成人免费网站 | 日本午夜免费福利视频 | 天天插天天狠天天透 | 久久午夜国产精品www忘忧草 | 亚洲欧美视频在线观看 | 色综合中文 | 日本精品久久久一区二区三区 | 男人的天堂视频网站 | www.婷婷| 久久中文字幕电影 | 羞羞色影院 | 久草a√ | 亚洲综合免费 | 亚洲69p| 日本不卡一区二区三区在线观看 | 人人爽人人草 | 亚洲视频国产视频 | 久久国产精99精产国高潮 | 九九福利 |