一、操作流程
1.获取证书文件
从证书供应商处下载对应tomcat适配的jks文件以及秘钥。
2.迁移证书
a.将jks证书文件拷贝至项目资源目录resouces下。
b.也可将证书存放至项目外,但后续配置路径需使用绝对路径。
3.修改项目配置文件
#https加密端口号 443
server.port=443
#SSL证书路径 一定要加上classpath:
#改成自己需要的证书名
server.ssl.key-store=classpath:*****.jks
#SSL证书密码
server.ssl.key-store-password=12345678
#证书类型
server.ssl.key-store-type=JKS
server.ssl.enabled=true
3.修改项目启动类
package com.barry.login;
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.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class DiyApplication {
public static void main(String[] args) {
SpringApplication.run(DiyApplication.class, args);
}
/**
* http重定向到https
* @return
*/
@Bean
public TomcatServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint constraint = new SecurityConstraint();
constraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
collection.addMethod(DEFAULT_PROTOCOL);
constraint.addCollection(collection);
context.addConstraint(constraint);
}
};
tomcat.addAdditionalTomcatConnectors(httpConnector());
return tomcat;
}
@Bean
public Connector httpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
//Connector监听的http的端口号
connector.setPort(8080);
connector.setSecure(false);
//监听到http的端口号后转向到的https的端口号
connector.setRedirectPort(443);//可调整到自己所需要的端口号,与配置文件中端口统一
return connector;
}
}
4.修改pom配置
防止java编译时对证书文件进行压缩破坏秘钥。
配置完成后先执行clean。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>*.jks</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>*.jks</include>
</includes>
</resource>
</resources>
</build>
二、问题整理
1.项目编译打包时报错
Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources) on project ***: Input length = 1 -> [Help 1]
解决方案:
在上述pom中添加的配置项导致报错,删除后改为将证书文件迁移至项目外,配置文件路径改为绝对路径,证书就能生效。
2.http的post请求被重定向至https的get方法导致无法定位。
解决方案:
在上述启动类的servletContainer方法中添加 collection.addMethod(DEFAULT_PROTOCOL);