SpringBoot使用JKS或PKCS12证书实现https
生成JKS类型的证书
可以利用jdk自带的keytool工具来生成证书文件,
默认生成的是JKS证书
cmd命令如下: 执行如下命令,并按提示填写证书内容,最后会生成server.keystore文件
keytool -genkey tomcat -keyalg RSA -keystore ./server.keystore
在springboot中配置这个JKS证书
需要在application.yml或application.properties配置文件里
配置server.ssl相关配置如下:
server:
port: 443 #https默认访问端口
servlet:
context-path: /demo
session:
timeout: 30m #默认会话过期时间30分钟
encoding:
enabled: true
charset: UTF-8
force: true
tomcat:
uri-encoding: UTF-8
ssl:
# 证书存放的位置
key-store: 'classpath:server.keystore'
# 证书别名
key-alias: tomcat
# 证书类型
key-store-type: JKS
# 证书密码
key-store-password: 123456
生成PKCS12类型的证书
keytool工具可以将刚刚生成的JKS证书升级为PKCS12类型的证书,
PKCS12类型的证书是目前行业标准格式。
升级命令如下,执行该命令后会生把之前的证书重命名为server.old.keystore,然后生成新的证书文件server.keystore
keytool -importkeystore -srckeystore ./server.keystore -destkeystore ./server.keystore -deststoretype pkcs12
在springboot中配置PKCS12证书
需要在application.yml或application.properties配置文件里
配置server.ssl相关配置如下:
server:
port: 443 #https默认访问端口
servlet:
context-path: /demo
session:
timeout: 30m #默认会话过期时间30分钟
encoding:
enabled: true
charset: UTF-8
force: true
tomcat:
uri-encoding: UTF-8
ssl:
# 证书存放的位置
key-store: 'classpath:server.keystore'
# 证书别名
key-alias: tomcat
# 证书类型
key-store-type: PKCS12
# 证书密码
key-store-password: 123456
配置tomcat连接器实现同时使用https和http访问
需要在springboot中新建一个配置类,配置tomcat里的http连接器
代码如下:
package cn.test;
import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class HttpConnectorConfig {
/**
* 配置http连接器
* 当访问80端口时,自动重定向到443端口
* 即访问http时,自动重定向到https端口
* @return Connector
*/
public Connector getHttpConnector(){
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setSecure(false);
connector.setPort(80);
connector.setRedirectPort(443);
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(getHttpConnector());
return tomcat;
}
}
以上操作配置完成后,启动springboot项目
可以观察到控制台已经启用了https和http这2种访问端口
[main] [] o.s.b.w.e.t.TomcatWebServer [TomcatWebServer.java : 220] Tomcat started on port(s): 443 (https) 80 (http) with context path '/demo'
打开浏览器测试
访问 http://localhost/demo/home
浏览器会重定向到 https://localhost/demo/home