用Spring Boot实现https ssl免密登录( 二 )


文章插图
 
在生成客户端证书时,那些信息不建议跳过,因为在后续的步骤中,会获取其中的信息用以登录 。比如我在 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免密登录

文章插图
 

用Spring Boot实现https ssl免密登录

文章插图
 

用Spring Boot实现https ssl免密登录

文章插图
【用Spring Boot实现https ssl免密登录】 
这时候刷新页面,浏览器就会弹出一个对话框,让你选择个人认证了 。
用Spring Boot实现https ssl免密登录

文章插图
 
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 = https://www.isolves.com/it/cxkf/kj/2021-01-07/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免密登录

文章插图
 

用Spring Boot实现https ssl免密登录

文章插图
 
Spring Boot 同时开启http和https相信大家都发现了,现在项目只能通过 https 访问,如果用 http 访问浏览器直接返回 Bad request 了 。
用Spring Boot实现https ssl免密登录

文章插图
 
要同时开启 https 和 http ,只需添加一个 TomcatConfig 就可以
@Configurationpublic class TomcatHttpConfig {@Beanpublic 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免密登录

文章插图
 
说明已经成功启动 http 在端口 9999 , https 在 8888 ,页面也可以成功访问了 。
用Spring Boot实现https ssl免密登录

文章插图
 
Spring Boot http自动跳转https上面我们已经可以同时访问 htt p和 https ,但如果我要访问 http 的时候,自动跳转的 https 呢?
只需要在上面的基础上稍微改改就可以了 。
@Configurationpublic class TomcatHttpConfig {@Beanpublic TomcatServletWebServerFactory servletContainer() {TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {@Overrideprotected 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;}}


推荐阅读