为了提高系统的安全性,建议web程序都采用https方式部署,以下为spring boot 2.1.1版本下的https的部署步骤(spring boot1.*版本包名有所变化):
1.证书生成
采用java自带keytool工具生成,在这里,我们一般采用pkcs12格式的证书。
进入jdk目录:C:\Program Files\Java\jdk1.8.0_161\bin
先生成jks类型的证书:
keytool -genkey -alias aicloud -keyalg RSA -validity 36500 -keystore d:\aicloud.keystore
此时按照步骤提示,输入秘钥、组织、城市等信息,完成后键入:是,保存到本地。
按照建议应将jks转换为更符合国际标准的pkcs12格式的证书,接下来将之前的jks证书转换为pkcs12证书,当然你也可以一次性生成pkcs12格式证书,2种证书的分别生成便于在不同应用场景下使用。
keytool -importkeystore -srckeystore d:\aicloud.keystore -destkeystore d:\aicloud.keystore -deststoretype pkcs12
根据提示键入:证书秘钥,完成后再本地生成一个pkcs格式的证书,原jks证书将自动另存为aicloud.keysotre.old文件,用于备份。
2.环境配置
这里采用idea2018.2开发工具,只需要设置yml或者properties的默认配置文件即可。
server:
session-timeout: 172800
port: 443 #https端口
httpport: 80 #http端口
httpport为自定义属性,用于http端口的部署和自动转发时使用,名称可以随意定义。
server:
ssl:
enabled: true
key-store: classpath:aicloud.keystore
key-store-password: *****
key-store-type: PKCS12
key-alias: ****
将以上两个配置合并到一个yml中,此处我用dev方式分开配置。
新建一个tomcat的启动bean,设置端口转发(springboot会自动识别配置文件,ssl开启后,会自动将server.port端口作为ssl的端口部署)。
/**
* Created by jeans on 2018/12/10.
* https自动跳转
*/
@Configuration
public class HttpsConfig {
@Value("${server.port}")
Integer httpsPort;
@Value("${server.httpport}")
Integer httpPort;
private Connector createHTTPConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
//同时启用http自动转发到https端口
connector.setScheme("http");
connector.setSecure(false);
connector.setPort(httpPort);
connector.setRedirectPort(httpsPort);
return connector;
}
@Bean
public ServletWebServerFactory servletContainer() {
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(createHTTPConnector());
return tomcat;
}
}
3.测试访问
启动spring boot,在chrome输入https地址:https://localhost 正常访问
验证http端口的自动跳转:
输入访问地址:http://localhost 访问后自动跳转 https://localhost 。
验证其它页面的自动跳转:http://localhost/druid/index.html 自定跳转到 https://localhost/druid/index.html
https默认端口443,http默认端口80,设置这两个端口后,在访问地址栏可省去端口的键入,其它端口需要完整输入端口号。
在正式的生产环境下,建议采用其它端口部署,避免端口的冲突,用nginx反向代理实现,证书可采用阿里云、腾讯云的免费域名证书,避免浏览器的不安全警告。