2018-12-20 Springboot2.x 中配置https

1、生成证书

如果大家对HTTPS不太了解可自行检索资料,这里就不在赘述HTTPS.

我们要想使用https协议,我们需要生成一个证书,这个证书我们可以自己生成,也可以从SSL证书中心获取(阿里云)自己生成的不被客户端认可,从授权中心获取的证书客户端才认可。有money的富豪可以去服务商哪里去获取(笔者是个穷鬼)我们这里使用的是自行生成的证书。

自己生成证书的方式很简单,直接使用java自带的keytool来生成,生成的命令如下:

keytool -genkeypair -alias "test1" -keyalg "RSA" -keysize 2048 -keystore " E:\tomcat.key"  -validity 3650

2018-12-20 Springboot2.x 中配置https_第1张图片

这里涉及到几个参数的含义我简单说一下:

1.-genkeypair 生成一对非对称密钥;

2.-keyalg 生证书的算法名称,RSA是一种非对称加密算法 

3.-keysize 证书大小 

4.-keystore 生成的证书文件的存储路径 

5.-validity 证书的有效期

执行完成后上面的命令后,就会在相对应的路径下生成对应的文件。获取到文件怎么使用进Spring boot项目呢?

2、Spring boot 2.x 配置SSL 使用 https

    2.1 首先,将刚刚获取的证书,放在心目的根目录下

2018-12-20 Springboot2.x 中配置https_第2张图片

    2.2 配置 application.yml 文件

2018-12-20 Springboot2.x 中配置https_第3张图片

3、也上步骤就将https配置完成。但是这样还不够,因为用户并不知道是否使用HTTPS ,大多数的用户是直接使用HTTP协议来访问我们的网站的。这时候我们需要添加HTTP自定转项到HTTPS的功能,当用户使用HTTP来进行访问的时候自动转为HTTPS的方式。这个配置很简单,在入口类中添加相应的转向Bean就行了。

    在springboot1.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(1111);

        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;

    }

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

       首先 这里需要使用 EmbeddedServletContainerFactory 这个类,但是在springboot2.x版本已经找不到这个类了。但是在网上大部分还都是根据1.x来实现的,这也是我为什么写这篇文章的初衷,所以需要下边代码实现springboot2.x版本HTTP自动转向HTTPS。

在springboot2.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(8033);

return connector;

}

@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;

}

到这,我们在springboot2.x项目中,当我们访问http://localhost:8080的时候系统会自动重定向到https://localhost:1111这个地址上。

区别就是EmbeddedServletContainerFactory 换成了TomcatServletWebServerFactory;

你可能感兴趣的:(2018-12-20 Springboot2.x 中配置https)