一、使用jdk自带的 keytools 创建证书
1、打开CMD窗口,输入命令
keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "D:\tomcat.keystore"
2、按照提示操作
输入密钥库口令: //输入密码不显示
再次输入新口令: //输入密码不显示
您的名字与姓氏是什么?
[Unknown]: xy
您的组织单位名称是什么?
[Unknown]: xy
您的组织名称是什么?
[Unknown]: xy
您所在的城市或区域名称是什么?
[Unknown]: sz
您所在的省/市/自治区名称是什么?
[Unknown]: gd
该单位的双字母国家/地区代码是什么?
[Unknown]: cn
CN=xy, OU=xy, O=xy, L=sz, ST=gd, C=cn是否正确?
[否]: y
输入 <tomcat> 的密钥口令
(如果和密钥库口令相同, 按回车): //再次输入刚才的密码
再次输入新口令: //再次输入刚才的密码
二、在application.yml配置文件,添加SSL
1)本文测试了以下几个格式证书格式
证书文件格式:.keystore、.p12、.jks、.pfx
证书类型:JKS(.keystore)、PKCS12(.p12、.jks、.pfx)宁愿不配置,也不要配置错,不然会报错
ssl:
# 证书文件
key-store: D:\tomcat.keystore
# 证书密码
key-store-password: 123456
# 证书类型(可以不配置)
key-store-type: JKS
# 证书别名(可以不配置)
key-alias: tomcat
2)配置完成后,就可以启动 Spring Boot 项目了,此时如果我们直接使用 Http 协议来访问接口,就会看到如下错误(解决方案:查看请求地址,将http改为https):
3)生成的 https 证书不被浏览器认可,直接点击【高级】继续访问就可以了(实际项目中只需要更换一个被浏览器认可的 https 证书即可)
三、配置http请求自动跳转为https
方案一:启动类添加如下代码
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){
@Override
protected void postProcessContext(Context context) {
SecurityConstraint constraint = new SecurityConstraint();
constraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
constraint.addCollection(collection);
context.addConstraint(constraint);
}
};
factory.addAdditionalTomcatConnectors(tomcatConnector());
return factory;
}
private Connector tomcatConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
//http端口号,可以自行指定(不能和其它已经使用的端口重复,否则会报错)
//设置http的监听端口为80端口,这样访问的时候也可以不用带上端口号
connector.setPort(8080);
connector.setSecure(false);
//监听到的http的端口号后转向到https的端口号,可以自行指定
connector.setRedirectPort(7002);
return connector;
}
方案二:添加配置文件
package com.yeffc.framework.config;
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.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @version V1.0
* @Description:
* @Author: Mr.Jie
* @Date: 2022/1/6 17:02
*/
@Configuration
public class TomcatConfig {
/**获取配置端口*/
@Value("${server.port}")
private Integer httpPort;
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){
@Override
protected void postProcessContext(Context context) {
SecurityConstraint constraint = new SecurityConstraint();
constraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
constraint.addCollection(collection);
context.addConstraint(constraint);
}
};
factory.addAdditionalTomcatConnectors(tomcatConnector());
return factory;
}
private Connector tomcatConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
//http端口号,可以自行指定(不能和其它已经使用的端口重复,否则会报错)
//设置http的监听端口为80端口,这样访问的时候也可以不用带上端口号
connector.setPort(8080);
connector.setSecure(false);
//监听到的http的端口号后转向到https的端口号,可以自行指定
connector.setRedirectPort(httpPort);
return connector;
}
}
访问:http://localhost:8080/fs_servers会自动跳转到:https://localhost:7002/fs_servers/