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: /demosession:timeout: 30m #默认会话过期时间30分钟encoding:enabled: truecharset: UTF-8force: truetomcat:uri-encoding: UTF-8ssl:# 证书存放的位置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: /demosession:timeout: 30m #默认会话过期时间30分钟encoding:enabled: truecharset: UTF-8force: truetomcat:uri-encoding: UTF-8ssl:# 证书存放的位置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;}@Beanpublic TomcatServletWebServerFactory tomcatServletWebServerFactory(){TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory(){@Overrideprotected 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