原创

SprinBoot项目配置HTTPS访问


部署完成SprinBoot项目后,在浏览器打开地址栏总会提示网页不安全,这是由于新版的Chrome如果没有使用HTTPS协议全部视为不安全,所以我们的项目需要配置HTTPS访问。

一、申请SSL证书

首先去腾讯云或者阿里云申请免费SSL证书,一般在域名服务商买了域名之后都可以免费申请SSL证书,不过证书有一年的有效期,到了有效期重新申请一下或者续期就好。我的域名是在腾讯云买的,以腾讯云为例,不建议自己生成,因为没办法测试发布环境的效果. 首先进入SSL证书页面点击申请免费证书:
申请证书
选择证书类型,默认就是有效期一年的DVSSL证书:
证书类型
然后填写个人信息,按照自己的具体情况填写:
点击申请
选择验证方式:
验证域名
然后验证域名,按照提示在DNS中加入记录就好。 验证方式
最后提示审核中才是申请成功,审核比较快,半小时就通过了。 申请6
通过之后点击下载按钮把证书下载到本地。压缩包内容如图:
下载

二、配置项目

因为springboot使用的是内置tomcat,所以我这边选择tomcat文件,如下图:
jks文件
在resources目录下导入xxx.jks,我的目录如下图:
导入证书
接下来配置application.yml文件,密码在刚刚下载的证书文件同文件夹的keystorePass.tx中,配添加如下配置:

server:
    port: 443    # 生产环境端口
    ssl:
        key-store: classpath:daozhi.vip.jks    # 证书文件路径
        key-password: 123456    # 证书密码
        key-store-type: JKS    # 证书类型

到这个时候基本配置完成,但不能使用https后就通知所有人重新保存网址,这时候就需要增加请求转发,自动从http转到https,这里有两种写法,第一种写法是在启动类也就是@SpringBootApplication注解类中加上使用,第二种是另外新建一个配置类,加上@Configuration注解声明。下面分别介绍一下两种写法:

三、在启动类中配置

将启动类中的代码改为以下形式:

/**
     * http重定向到https
     * @return
     */
    @Bean
    public TomcatServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @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(httpConnector());
        return tomcat;
    }

    @Bean
    public Connector httpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        //Connector监听的http的默认端口号
        connector.setPort(80);
        connector.setSecure(false);
        //监听到http的端口号后转向到的https的端口号,也就是项目配置的port
        connector.setRedirectPort(443);
        return connector;
    }

四、添加新的配置类

新建一个配置类,如下:

@Configuration
public class TomcatConfig {
    @Bean
    TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
        TomcatEmbeddedServletContainerFactory factory = 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);
            }
        };
        factory.addAdditionalTomcatConnectors(createTomcatConnector());
        return factory;
    }

    private Connector createTomcatConnector() {
        Connector connector = new
                Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(80);
        connector.setSecure(false);
        connector.setRedirectPort(443);
        return connector;
    }
}

五、最终效果

重新启动项目,通过浏览器访问,无论输入的是http还是https都将被重定向到https,也看到了熟悉的小锁图标:
最终效果

SpringBoot
环境配置
Web安全
  • 作者:Daozhi(联系作者)
  • 发表时间:2021-05-11 00:25
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码
  • 评论