• API安全(七)-https


    1、为什么要使用https

      以用户注册为例,通过数据校验,可以保证用户传给我们的密码是完整有效的。数据进来之后,通过我们的处理,存放到数据库中的密码是经过加密的,也是安全的。但是还有一点,就是用户的请求在到达我们应用之前的一个安全,怎么来保证?用户注册的请求,在到达服务器之前,就被别人给截获了。用户名和密码被别人截获了,实际上我们应用程序后面做什么都没用了,因为别人已经知道了用户名和密码了。要保证者之间的安全要使用https。

    2、什么是https

      HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS 在HTTP 的基础下加入SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 HTTPS 存在不同于HTTP 的默认端口及一个加密/身份验证层(在 HTTP与 TCP 之间)。这个系统提供了身份验证与加密通讯方法。它被广泛用于万维网上安全敏感的通讯,例如交易支付等方面 。

    3、https主要干了什么

      3.1、客户端和服务端在传输数据之前,会对双方进行身份认证 ,认证成功建立连接。

      3.2、数据传输的机密性,一旦安全连接建立以后,在传输的过程中,会对数据进行加密,那么就算在中间拿到了https传输的数据,也都是经过加密的。

    4、SpringBoot使用https

      4.1、使用java的keytool生成自签证书

      使用以下命令生成自签证书

     

      4.2、将证书放到resources目录下

       4.3、修改application.yml配置文件

    server:
      port: 8443
      ssl:
        key-store: classpath:cfq.key
        key-store-password: 123456
        key-password: 123456

      4.4、启动项目,看控制台打印,已经是https启动了

      访问https://127.0.0.1:8443/users/40,因为是我们自签的证书,所以要自己点击高级,点击接收风险并继续,会弹出认证框,输入用户名密码,可以正常通过https访问

    5、Springboot同时支持https和http

      SpringBoot设置了https,就不用http访问了,会直接拒绝掉,如果想支持http和https的话,要进行一下配置

      5.1、配置文件中,自定义http端口

    http:
      port: 9090

      5.2、启动类配置如下

    /**
     * @author caofanqi
     * @date 2020/1/20 13:00
     */
    @SpringBootApplication
    public class UserApiApplication {
    
        @Value("${http.port}")
        private Integer port;
    
        public static void main(String[] args) {
            SpringApplication.run(UserApiApplication.class, args);
        }
    
        @Bean
        public ServletWebServerFactory servletContainer() {
            TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
            tomcat.addAdditionalTomcatConnectors(createStandardConnector());
            return tomcat;
        }
    
        private Connector createStandardConnector() {
            Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
            connector.setPort(port);
            return connector;
        }
    }

      5.3、启动项目,看控制台打印,已经是https与http启动了

       5.4、测试通过 https://127.0.0.1:8443/users/40 与 http://127.0.0.1:9090/users/40都可进行访问

    6、Springboot同时支持http强制跳转https

      修改启动类配置如下

    /**
     * @author caofanqi
     * @date 2020/1/20 13:00
     */
    @SpringBootApplication
    public class UserApiApplication {
    
        @Value("${http.port}")
        private Integer port;
    
        @Resource
        private ServerProperties serverProperties;
    
        public static void main(String[] args) {
            SpringApplication.run(UserApiApplication.class, args);
        }
    
    
        @Bean
        public ServletWebServerFactory servletContainer() {
            TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
                @Override
                protected void postProcessContext(Context context) {
                    // 强制使用https
                    SecurityConstraint constraint = new SecurityConstraint();
                    constraint.setUserConstraint("CONFIDENTIAL");
                    SecurityCollection collection = new SecurityCollection();
                    collection.addPattern("/*");
                    constraint.addCollection(collection);
                    context.addConstraint(constraint);
                }
            };
            //添加http
            tomcat.addAdditionalTomcatConnectors(createStandardConnector());
            return tomcat;
        }
    
        /**
         *  配置http
         */
        private Connector createStandardConnector() {
            Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
            connector.setPort(port);
            //http重定向到https时的https端口号
            connector.setRedirectPort(serverProperties.getPort());
            return connector;
        }
    
    
    }

      这时访问http://127.0.0.1:9090/users/40会强制跳转为https://127.0.0.1:8443/users/40

    项目源码:https://github.com/caofanqi/study-security/tree/dev-https

     

  • 相关阅读:
    一月5日
    一月5日
    面试java工程师的自我介绍(模拟篇)
    Spring Boot Jpa 介绍
    spring+redis做缓存使用
    Spring Boot Web 开发详解
    thymeleaf+spring的简单搭建
    如何搭建 Spring boot
    通用baseDao
    pagehelper的使用
  • 原文地址:https://www.cnblogs.com/caofanqi/p/12238921.html
Copyright © 2020-2023  润新知