前言
springboot项目直接http访问不安全,如何开启https?
如何配置ssl
创建证书
注意:如果你有CA办法的数字证书,可以使用直接使用CA颁发的证书。非可信CA或者私人颁发的证书在浏览器地址栏会显示红色,不安全不受信任。
如果你没有数字证书,可以使用keytool 自己手动颁发一个证书供学习或者测试。
如何自己生成证书,请见相关链接
keytool工具生成JKS证书
也可以在阿里云申请数字证书,申请完证书后,点击下载证书后会有不同类型的证书提供。
配置和转发
将生成的证书放到resources/ssl目录下
编写yaml配置文件
custom:
http-port: 8080 #http端口,正常应该配置80
server:
port: 8888 #https端口,正常应该配置443
ssl: #ssl配置
enabled: true # 默认为true
#key-alias: alias-key # 别名(可以不进行配置)
# 保存SSL证书的秘钥库的路径
key-store: classpath:ssl/www.mytools.com.jks
key-password: 951753
key-store-password: 951753
key-store-type: JKS #证书类型
创建编写HttpsConfig
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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* https配置,将http请求全部转发到https,访问http端口也指向https
*
*/
@Configuration
public class HttpsConfig {
@Value("${custom.http-port:8889}")
private Integer httpPort;
@Value("${server.port:8888}")
private Integer port;
@Bean
public TomcatServletWebServerFactory servletContainer() {
// 将http请求转换为https请求
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint constraint = new SecurityConstraint();
// 默认为NONE
constraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
// 所有的东西都https
collection.addPattern("/*");
constraint.addCollection(collection);
context.addConstraint(constraint);
}
};
tomcat.addAdditionalTomcatConnectors(httpConnector());
return tomcat;
}
/**
* 强制将所有的http请求转发到https
*
* @return httpConnector
*/
@Bean
public Connector httpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
// connector监听的http端口号
connector.setPort(httpPort);
connector.setSecure(false);
// 监听到http的端口号后转向到的https的端口号
connector.setRedirectPort(port);
return connector;
}
}
配置pom.xml,需要注意将证书打包到发布包
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<nonFilteredFileExtensions>
<!--<nonFilteredFileExtension>p12</nonFilteredFileExtension>-->
<nonFilteredFileExtension>jks</nonFilteredFileExtension>
<nonFilteredFileExtension>cer</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
</plugins>
</build>
启动项目验证