美文网首页
Java Spring Boot 下配置HTTPS接口并实现HT

Java Spring Boot 下配置HTTPS接口并实现HT

作者: Charles_Zhang | 来源:发表于2018-08-29 10:47 被阅读0次
    • 本文以Spring Boot2.x为例,文末会介绍Spring Boot1.x的相关方法
    • 写在题首:现在网上大多关于这点的教程是以Spring Boot1.x为例,所以作者在写代码的过程中发现其中用到的类EmbeddedServletContainerFactory 找不到,几经查找发现此类在Spring Boot2.x 中已经废弃,改为TomcatServletWebServerFactory

    在默认情况下我们创建一个 Java Spring Boot 的后台工程,并配置了端口(此处以port:8085为例)之后,便可以制作一个接口共外部访问,例如:

    @RestController  
    public class TestController {  
      
        @RequestMapping(value = "/hello", method = RequestMethod.GET)  
        public String testIndex() {  
            return "这是hanxun商城后台的测试接口!";  
      }  
      
    }
    

    此时我们就可以在本机浏览器中通过 http://localhost:8075/hello 的方式来调用该接口,当然这种情况下默认的接口类型是 Http的。这时候如果我们希望将这种接口改为Https 类型的,可做如下配置:。

    证书生成

    使用SSL需要我们先生成一个证书,这个证书我们可以自己生成,也可以从SSL证书授权中心获得,自己生成的不被客户端认可,从授权中心获得的可以被客户端认可,提供SSL授权证书的服务商有很多,小伙伴们有兴趣可以自行查找,我这里以自己生成的证书为例。 生成方式也很简单,直接使用java自带的命令keytool来生成,生成命令如下:

    `keytool -genkey -alias tomcat  -storetype PKCS12 -keyalg RSA -keysize 2048  -keystore keystore.p12 -validity 3650`
    

    此处涉及到的几个参数含义如下:

    1. -storetype 指定密钥仓库类型  
    2. -keyalg 生证书的算法名称,RSA是一种非对称加密算法  
    3. -keysize 证书大小  
    4. -keystore 生成的证书文件的存储路径  
    5. -validity 证书的有效期
    

    在此命令执行过程中会出现以下内容:

    输入密钥库口令:
    
    密钥库口令太短 - 至少必须为 6 个字符
    
    输入密钥库口令:
    
    再次输入新口令:
    

    此处我输入的口令(即证书的密码):1234567890这个在代码中会用到,需要牢记。
    随后出现:

    您的名字与姓氏是什么?
    
    [Unknown]:
    
    您的组织单位名称是什么?
    
    [Unknown]:
    
    您的组织名称是什么?
    
    [Unknown]:
    
    您所在的城市或区域名称是什么?
    
    [Unknown]:
    
    您所在的省/市/自治区名称是什么?
    
    [Unknown]:
    
    该单位的双字母国家/地区代码是什么?
    
    [Unknown]:
    
    CN=Unknown, OU=hanxun, O=hanxun, L=Unknown, ST=Unknown, C=Unknown是否正确?
    
    [否]:  y
    

    以上内容可填写也可不填,不填的话直接按下 回车 键 即可,在最后一步中想输入 y 确定。至此,证书生成的工作完成。

    工程文件代码配置

    在执行完上面一行命令后,在你的系统的当前用户目录下会生成一个keystore.p12文件(如果你修改了证书文件的名称那就是你 修改的名字.p12),将这个文件拷贝到我们项目的根目录下,然后修改application.properties 文件或是 application.yml文件,添加HTTPS支持。在上面提到的问价中添加如下代码:

    server:  
     ssl: key-store: keystore.p12  
        key-store-password: 1234567890  
        key-store-type: PKCS12  
        key-alias: tomcat
    

    此处,keystore.p12为上文中生成的证书文件,并以此来指定签名文件, 1234567890为命令中输入的证书口令,key-store-type 为指定秘钥仓库的类型,key-alias 是指定别名。

    通过以上的配置之后我们便可以在浏览器中 通过HTTPS 的方式来访问接口了,访问结果如下所示如下:

    图中的端口8075 为本文开始处设置的端口。

    配置HTTP自动转向HTTPS

    进行到这里通过Https 来访问没有问题了,但是不可避免的。有些用户并不知道这是个 Https接口,还是会使用Http 来访问,这是浏览器中就会报错,如下图所示:


    这个时候我们需要添加HTTP自动转向HTTPS的功能,当用户使用HTTP来进行访问的时候自动转为HTTPS的方式。这个配置很简单,在入口类中添加相应的转向Bean就行了,如下:
    /**  
     *@Despription HTTP自动转向HTTPS 设置1  
     *@Params  
     *@return  
     *@Created Charles.Zhang  
     *@Time 2018/8/29  
     *@Modify  
     */  
    @Bean  
    public Connector connector(){  
      
        Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");  
      
        connector.setScheme("http");  
      
        connector.setPort(8080);   
      
        connector.setSecure(false);  
      
        connector.setRedirectPort(8075);  
      
        return connector;  
      
    }  
      
    /**  
     *@Despription HTTP自动转向HTTPS 设置2  
     *@Params  
     *@return  
     *@Created Charles.Zhang  
     *@Time 2018/8/29  
     *@Modify  
     */  
    @Bean  
    public TomcatServletWebServerFactory tomcatServletWebServerFactory(){  
      
        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(connector());  
      
          return tomcat;  
      
    }
    

    这个时候当我们访问http://localhost:8080的时候系统会自动重定向到https://localhost:8075这个地址上。

    Spring boot1.x 下的配置 EmbeddedServletContainerFactory

    这里用到的类是:TomcatServletWebServerFactory ,但是在 Spring boot1.x 下 使用的是 EmbeddedServletContainerFactory,下面将在 Spring boot1.x下的用法展示如下:

    @Bean
    
    public Connector connector(){
    
        Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
    
        connector.setScheme("http");
    
        connector.setPort(8080);
    
        connector.setSecure(false);
    
        connector.setRedirectPort(8075);
    
        return connector;
    
    }
    
    @Bean
    
    public EmbeddedServletContainerFactory servletContainer() {
    
        TomcatEmbeddedServletContainerFactory tomca t= new TomcatEmbeddedServletContainerFactory() {
    
            @Override
    
            protected void postProcessContext(Context context) {
    
            SecurityConstraint constraint = new SecurityConstraint();
    
            constraint.setUserConstraint("CONFIDENTIAL");
    
            SecurityCollection collection = new SecurityCollection();
    
            collection.addPattern("/");
    
            constraint.addCollection(collection);
    
            context.addConstraint(constraint);
    
            }
    
        };
    
        tomcat.addAdditionalTomcatConnectors(connector());
    
        return tomcat;
    
    }
    

    相关文章

      网友评论

          本文标题:Java Spring Boot 下配置HTTPS接口并实现HT

          本文链接:https://www.haomeiwen.com/subject/hzdhwftx.html