部署完成SprinBoot项目后,在浏览器打开地址栏总会提示网页不安全,这是由于新版的Chrome
如果没有使用HTTPS
协议全部视为不安全,所以我们的项目需要配置HTTPS访问。
首先去腾讯云或者阿里云申请免费SSL证书,一般在域名服务商买了域名之后都可以免费申请SSL证书,不过证书有一年的有效期,到了有效期重新申请一下或者续期就好。我的域名是在腾讯云买的,以腾讯云为例,不建议自己生成,因为没办法测试发布环境的效果.
首先进入SSL证书页面点击申请免费证书:
选择证书类型,默认就是有效期一年的DVSSL证书:
然后填写个人信息,按照自己的具体情况填写:
选择验证方式:
然后验证域名,按照提示在DNS中加入记录就好。
最后提示审核中才是申请成功,审核比较快,半小时就通过了。
通过之后点击下载按钮把证书下载到本地。压缩包内容如图:
因为springboot使用的是内置tomcat,所以我这边选择tomcat文件,如下图:
在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,也看到了熟悉的小锁图标:
评论