• SpringBoot利用证书实现https双向绑定并解析客户端证书


    1、生成客户端证书、密钥文件

    该流程请参考该博主

    基于springboot实现的https单向认证和双向认证(java生成证书)_白帽菌的博客-CSDN博客_springboot单向认证

     

     2、springboot实现

    项目结构

     代码实现

    MyInterceptor.java

    1. package com.test.verfiy.config;
    2. import org.slf4j.Logger;
    3. import org.slf4j.LoggerFactory;
    4. import org.springframework.web.method.HandlerMethod;
    5. import org.springframework.web.servlet.HandlerInterceptor;
    6. import org.springframework.web.servlet.ModelAndView;
    7. import javax.servlet.http.HttpServletRequest;
    8. import javax.servlet.http.HttpServletResponse;
    9. import java.lang.reflect.Method;
    10. import java.security.cert.X509Certificate;
    11. /**
    12. * @author Liwei
    13. * @date 2022/8/3 17:34
    14. * @description
    15. */
    16. public class MyInterceptor implements HandlerInterceptor {
    17. private static final Logger logger = LoggerFactory.getLogger(MyInterceptor.class);
    18. @Override
    19. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    20. HandlerMethod handlerMethod = (HandlerMethod) handler;
    21. Method method = handlerMethod.getMethod();
    22. String methodName = method.getName();
    23. logger.info("====拦截到了方法:{},在该方法执行之前执行====", methodName);
    24. // 返回true才会继续执行,返回false则取消当前请求
    25. X509Certificate[] x509Certificates = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");
    26. X509Certificate cer = (X509Certificate)x509Certificates[0];
    27. logger.info("版本号:" + cer.getVersion());
    28. logger.info("序列号:" + cer.getSerialNumber().toString());
    29. logger.info("颁发者:" + cer.getSubjectDN()); // logger.info("颁发者唯一标识符: " + cer.getSubjectUniqueID().toString());
    30. logger.info("使用者:" + cer.getIssuerDN());
    31. // logger.info("使用者唯一标识符: " + cer.getIssuerUniqueID().toString());
    32. logger.info("有效期:from:" + cer.getNotBefore() + " to: " + cer.getNotAfter());
    33. logger.info("签发算法" + cer.getSigAlgName());
    34. logger.info("签发算法ID:" + cer.getSigAlgOID());
    35. logger.info("证书签名:" + cer.getSignature().toString());
    36. return true;
    37. }
    38. @Override
    39. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    40. logger.info("执行完方法之后进执行(Controller方法调用之后),但是此时还没进行视图渲染");
    41. }
    42. @Override
    43. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    44. logger.info("整个请求都处理完咯,DispatcherServlet也渲染了对应的视图咯,此时我可以做一些清理的工作了");
    45. }
    46. }

    MyInterceptorConfig.java

    1. package com.test.verfiy.config;
    2. import org.springframework.context.annotation.Configuration;
    3. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    4. import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
    5. /**
    6. * @author Liwei
    7. * @date 2022/8/3 17:35
    8. * @description
    9. */
    10. @Configuration
    11. public class MyInterceptorConfig extends WebMvcConfigurationSupport {
    12. @Override
    13. protected void addInterceptors(InterceptorRegistry registry) {
    14. registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    15. super.addInterceptors(registry);
    16. }
    17. }

    VerfiyController.java

    1. package com.test.verfiy.controller;
    2. import org.springframework.web.bind.annotation.GetMapping;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import org.springframework.web.bind.annotation.RestController;
    5. /**
    6. * @author Liwei
    7. * @date 2022/7/29 16:19
    8. * @description
    9. */
    10. @RestController
    11. @RequestMapping("/api")
    12. public class VerfiyController {
    13. @GetMapping("/test")
    14. public String test() {
    15. return "Hello World!";
    16. }
    17. }

    配置

    server.port=443

    server.ssl.enabled=true
    server.ssl.key-store-type=JKS
    server.ssl.key-store=classpath:localhost.jks
    server.ssl.key-store-password=changeit
    server.ssl.key-alias=localhost
    #server.ssl.protocol=TLS
    server.ssl.trust-store=classpath:localhost.jks
    server.ssl.trust-store-password=changeit
    server.ssl.trust-store-provider=SUN
    server.ssl.trust-store-type=JKS
    server.ssl.client-auth=need

     

     

  • 相关阅读:
    从现在开始:让AI写代码,你只负责敲tab键
    Linux系统编程·进程地址空间
    栈:C++实现
    【rainbowzhou 面试11/101】技术提问--说说你做的大数据性能测试案例
    QT Object定时器使用
    数组处理方法总结
    Linux 中的 chkconfig 命令及示例
    一套SCDM脚本建模与二次开发攻略
    基于Spring Boot+Vue的毕业设计选题管理系统设计与实现
    设备树与中断,操作系统如何使用中断
  • 原文地址:https://blog.csdn.net/m0_43432638/article/details/127729184