前端时间研发了一款企业级的门户网站系统是基于Spring Boot。需要为网站改为https
1、什么是Https
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。
2、生成证书
Https的安全基础是SSL,使用SSL需要先生成一个证书。该证书可以来自SSL证书授权中心。当然也可以自己生成,只不过自己生成的证书不被客户端认可。
2.1、工具
可以使用Java自带工具keytool
生成.在windows环境下进入cmd命令行使用如下命令:
#> keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
2.2、,命令说明
- -storetype 指定密钥仓库类型
- -keyalg 生证书的算法名称,RSA是一种非对称加密算法
- -keysize 证书大小
- -keystore 生成的证书文件的存储路径
- -validity 证书的有效期
2.3、回车
按下回车会弹出图下内容
#> C:\>keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: hanson
您的组织单位名称是什么?
[Unknown]: wz
您的组织名称是什么?
[Unknown]: wz
您所在的城市或区域名称是什么?
[Unknown]: wz
您所在的省/市/自治区名称是什么?
[Unknown]: js
该单位的双字母国家/地区代码是什么?
[Unknown]: cn
CN=hanson, OU=wz, O=wz, L=wz, ST=js, C=cn是否正确?
会在本地生成一个keystore.p12文件,将该文件导入到spring boot项目的resource目录下
3、项目改造
3.1、修改配置文件
server:
ssl:
key-store: classpath:keystore.p12
key-store-type: PKCS12
key-alias: tomcat
key-store-password: 123456
port: 8081 # https端口
tomcat:
max-threads: 500 # 最大线程数量
max-connections: 2000 # 最大连接数
uri-encoding: UTF-8
4、启动测试
4.1、存在问题
ip和端口会被域名代替。我们能不能实现访问http://ip:端口/web 重定向到https://ip:端口/web。
4.2、解决办法
在配置文件中定义一个属性http.port=8081 server.port=8080
然后在任意的一个标注@SpringBootConfiguration的类中加上如下代码。需要注入Environment接口以便获取当前运行环境变量
@Bean
public EmbeddedServletContainerFactory embeddedServletContainerFactory() {
TomcatEmbeddedServletContainerFactory factory =
new TomcatEmbeddedServletContainerFactory() {
@Override
protected void postProcessContext(Context context) {
//SecurityConstraint必须存在,可以通过其为不同的URL设置不同的重定向策略。
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
factory.addAdditionalTomcatConnectors(createHttpConnector());
return factory;
}
/**
* HTTP自动转发到HTTPS
*
* @return
*/
public Connector createHttpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setSecure(false);
//http端口(这是要新增加的一个端口)
String httpPort = environment.getProperty("http.port");
connector.setPort(Integer.parseInt(httpPort));
//https端口,tomcat启动的默认端口
Integer HTTPS_PORT = Integer.parseInt(environment.getProperty("server.port"));
connector.setRedirectPort(HTTPS_PORT);
LOGGER.info("Http访问端口:[{}],Https访问端口:[{}]", httpPort, HTTPS_PORT);
return connector;
}
重启应用。访问http://ip:8081/web 会被重定向到https://ip:8080/web