1、生成证书
如果大家对HTTPS不太了解可自行检索资料,这里就不在赘述HTTPS.
我们要想使用https协议,我们需要生成一个证书,这个证书我们可以自己生成,也可以从SSL证书中心获取(阿里云)自己生成的不被客户端认可,从授权中心获取的证书客户端才认可。有money的富豪可以去服务商哪里去获取(笔者是个穷鬼)我们这里使用的是自行生成的证书。
自己生成证书的方式很简单,直接使用java自带的keytool来生成,生成的命令如下:
keytool -genkeypair -alias "test1" -keyalg "RSA" -keysize 2048 -keystore " E:\tomcat.key" -validity 3650
这里涉及到几个参数的含义我简单说一下:
1.-genkeypair 生成一对非对称密钥;
2.-keyalg 生证书的算法名称,RSA是一种非对称加密算法
3.-keysize 证书大小
4.-keystore 生成的证书文件的存储路径
5.-validity 证书的有效期
执行完成后上面的命令后,就会在相对应的路径下生成对应的文件。获取到文件怎么使用进Spring boot项目呢?
2、Spring boot 2.x 配置SSL 使用 https
2.1 首先,将刚刚获取的证书,放在心目的根目录下
2.2 配置 application.yml 文件
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;