电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

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

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

要讓項目實現 ssl 免密登錄,首先需要開啟 https

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

創建服務端證書

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

實際開發中,會在網上申請一個機構頒發的證書。這里為了方便,我會使用 openssl 命令自己生成一個證書來使用。

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

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

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

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

要在 Spring Boot 中實現服務器端 X.509 身份驗證,還需要給我們的服務端也生成一個證書。

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

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

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

vi conf.config

authorityKeyIdentifier=keyid,issuerbasicConstraints=CA:FALSEsubjectAltName = @alt_names[alt_names]DNS.1 = localhost

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

然后給服務端證書簽名,會提示你輸入 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 實現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 復制到 resources 目錄下之后編譯項目

Spring Boot 實現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 中,選擇 受信任的根證書頒發機構 導入 rootCA.crt

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

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

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

創建信托證書

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

這里我們只要將 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 實現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 實現https ssl免密登錄(X.509 pki登錄)

創建客戶端證書

現在創建一個客戶端的證書,步驟和服務端的差不多一樣。

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

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

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

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

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

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

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

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

Spring Boot獲取個人證書信息

恭喜你,到了這一步, pki 登錄已經完成了 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 實現https ssl免密登錄(X.509 pki登錄)

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

Spring Boot 同時開啟http和https

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

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

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

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

Spring Boot http自動跳轉https

上面我們已經可以同時訪問 htt p和 https ,但如果我要訪問 http 的時候,自動跳轉的 https 呢?

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

@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; }}踩坑總結 把服務端證書p12文件添加到項目resources后,記得rebuild項目,否則target的classes中沒有生成證書文件,會導致項目啟動失敗。 application.properties中的server.ssl.keyAlias需要和生成p12文件的-name一致,否則也會導致項目無法啟動。 如果要指定域名,需要修改conf.confg中的DNS.1,否則瀏覽器會提示網站不安全。代碼地址

https://github.com/Shurlormes/pkilogin

參考資料

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

到此這篇關于Spring Boot 實現https ssl免密登錄(X.509 pki登錄)的文章就介紹到這了,更多相關Spring Boot https ssl免密登錄內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 胶泥瓷砖胶,轻质粉刷石膏,嵌缝石膏厂家,腻子粉批发,永康家德兴,永康市家德兴建材厂 | 防水接头-电缆防水接头-金属-电缆密封接头-不锈钢电缆接头 | 青州开防盗门锁-配汽车芯片钥匙-保险箱钥匙-吉祥修锁店 | 钢木实验台-全钢实验台-化验室通风柜-实验室装修厂家-杭州博扬实验设备 | 浙江建筑资质代办_二级房建_市政_电力_安许_劳务资质办理公司 | 实验室pH计|电导率仪|溶解氧测定仪|离子浓度计|多参数水质分析仪|pH电极-上海般特仪器有限公司 | 江西自考网| 高考志愿规划师_高考规划师_高考培训师_高报师_升学规划师_高考志愿规划师培训认证机构「向阳生涯」 | PTFE接头|聚四氟乙烯螺丝|阀门|薄膜|消解罐|聚四氟乙烯球-嘉兴市方圆氟塑制品有限公司 | 技德应用| 铸铝门厂家,别墅大门庭院大门,别墅铸铝门铜门[十大品牌厂家]军强门业 | 济南保安公司加盟挂靠-亮剑国际安保服务集团总部-山东保安公司|济南保安培训学校 | 无菌实验室规划装修设计-一体化实验室承包-北京洁净净化工程建设施工-北京航天科恩实验室装备工程技术有限公司 | 玉米深加工设备-玉米深加工机械-新型玉米工机械生产厂家-河南粮院机械制造有限公司 | 小型铜米机-干式铜米机-杂线全自动铜米机-河南鑫世昌机械制造有限公司 | 药品/药物稳定性试验考察箱-埃里森仪器设备(上海)有限公司 | 北京网站建设公司_北京网站制作公司_北京网站设计公司-北京爱品特网站建站公司 | 代做标书-代写标书-专业标书文件编辑-「深圳卓越创兴公司」 | 涂层测厚仪_光泽度仪_uv能量计_紫外辐照计_太阳膜测试仪_透光率仪-林上科技 | 衡阳耐适防护科技有限公司——威仕盾焊接防护用品官网/焊工手套/焊接防护服/皮革防护手套 | 周口市风机厂,周鼓风机,河南省周口市风机厂| 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 厂房出租_厂房出售_产业园区招商_工业地产 - 中工招商网 | 压缩空气检测_气体_水质找上海京工-服务专业、价格合理 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 | 广州工业氧气-工业氩气-工业氮气-二氧化碳-广州市番禺区得力气体经营部 | 北钻固控设备|石油钻采设备-石油固控设备厂家 | 苏州伊诺尔拆除公司_专业酒店厂房拆除_商场学校拆除_办公楼房屋拆除_家工装拆除拆旧 | 生物风-销售载体,基因,质粒,ATCC细胞,ATCC菌株等,欢迎购买-百风生物 | 【德信自动化】点胶机_全自动点胶机_自动点胶机厂家_塑料热压机_自动螺丝机-深圳市德信自动化设备有限公司 | 承插管件_不锈钢承插管件_锻钢高压管件-温州科正阀门管件有限公司 | 武汉画册印刷厂家-企业画册印刷-画册设计印刷制作-宣传画册印刷公司 - 武汉泽雅印刷厂 | 铝合金电阻-无源谐波滤波器-上海稳达电讯设备厂| 双齿辊破碎机-大型狼牙破碎机视频-对辊破碎机价格/型号图片-金联机械设备生产厂家 | 热缩管切管机-超声波切带机-织带切带机-无纺布切布机-深圳市宸兴业科技有限公司 | 智能楼宇-楼宇自控系统-楼宇智能化-楼宇自动化-三水智能化 | 算命免费_生辰八字_免费在线算命 - 卜算子算命网 | 温州富欧金属封头-不锈钢封头厂家 | 出国劳务公司_正规派遣公司[严海]| 特材真空腔体_哈氏合金/镍基合金/纯镍腔体-无锡国德机械制造有限公司 |