色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:6日期:2023-07-27 10:11:48

要讓項目實現(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

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

所有的密碼都是 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,issuerbasicConstraints=CA:FALSEsubjectAltName = @alt_names[alt_names]DNS.1 = localhost

其中 DNS.1 的值就是你的域名,比如 www.segmentfault.comlocalhost 等等。如果這里填錯了,訪問網(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

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

最后再將簽名證書和私鑰打包到 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 目錄下之后編譯項目

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

修改application.properties文件

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

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

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

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

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

創(chuàng)建信托證書

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

這里我們只要將 rootCA.crt 添加進去就可以了

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

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

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

application.properties添加:

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

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

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

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

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

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

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

在生成客戶端證書時,那些信息不建議跳過,因為在后續(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)入,期間會要你輸入它的密碼。

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

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

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

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

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

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 實現(xiàn)https ssl免密登錄(X.509 pki登錄)

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

Spring Boot 同時開啟http和https

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

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

要同時開啟 httpshttp ,只需添加一個 TomcatConfig 就可以

@Configurationpublic 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; }}

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

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

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

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

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

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

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

@Configurationpublic 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)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 国产真实乱子伦精品视手机观看 | 日本免费网站视频www区 | 最新国产美女肝交视频播放 | 三级毛片在线播放 | 成年人在线视频 | 国产高清免费影视在线观看 | 国产精品久久久久三级 | 太平公主三级dvd | 久久精品高清视频 | 国产欧美一区二区三区视频在线观看 | 在线成人aa在线看片 | 成人a级高清视频在线观看 成人a毛片 | 国产91香蕉视频 | 国产一区二区三区久久精品小说 | 久久精品国产亚洲欧美 | 国产日韩欧美一区二区三区综合 | 欧美另类色 | 免费观看性欧美一级 | 中文字幕色站 | 成人交性视频免费看 | 精品 日韩 国产 欧美在线观看 | 久久久久久国产精品免费免 | 在线看a级片 | 久久青青草视频 | 欧美精品一级毛片 | 日黄网站 | 久久99热成人精品国产 | 成人毛片一区二区三区 | 欧洲欧美成人免费大片 | 台湾三级香港三级在线中文 | 日韩精品一区二区三区中文字幕 | 狠狠色丁香久久婷婷综合_中 | 男女扒开双腿猛进入爽爽视频 | yy毛片 | 美女很黄很黄是免费的·无遮挡网站 | 美女免费黄网站 | 本道久久综合88全国最大色 | 美国一级毛片免费看成人 | 欧美成人精品第一区 | 男人天堂视频网站 | 亚洲国产精品91 |