您现在的位置是:首页 >技术交流 >Spring Boot 使用SSL-HTTPS网站首页技术交流
Spring Boot 使用SSL-HTTPS
简介Spring Boot 使用SSL-HTTPS
Spring Boot 使用SSL-HTTPS
HTTPS协议可以理解为HTTP+SSL/TLS,可以理解为HTTP下加入了SSL层,通过SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。
-
SSL(Secure Socket Layer安全套接字层):SSL协议位于TCP/IP协议和应用层协议之间,为数据通讯提供安全支持。 -
TLS(Transport Layer Security传输层安全):用于两个应用程序之间,提供保密性和数据完整性。
SpringBoot中使用HTTPS
-
获取SSL证书
-
通过证书授权机构进行SSL证书购买
-
通过keytool自己生成(主要用于测试环境)
-
此次采用keytool生成(windows电脑完成)
-
要求jdk环境变量配置正确
-
打开CMD窗口
-
采用命令生成
keytool -genkey -alias test -storetype PKCS12 -keyalg RSA -keystore test.p12 -validity 365
参数 含义 -genkey 生成key -alias 指定key的别称 -storetype 指定秘钥库类型 常用有JKS、JCEKS、PKCS12、BKS、UBER -keyalg 指定秘钥的算法 -keystore 证书库的路径及名称 -validity 指定创建的证书有效期(天)
-
-
-
-
在Springboot中启动HTTPS
-
将生成的证书放到src/main/resources目录下
通过上述方式生成的证书名为 test.p12 在当前用户目录下,即 C:Users当前用户名
将该文件放到工程的src/main/resources目录下
-
-
在application.yaml中配置https
server:
#https端口号
port: 443
ssl:
#证书的路径
key-store: classpath:test.p12
#证书密码
key-store-password: 123456
#生疏秘钥库类型
key-store-type: PKCS12
#证书别名
key-alias: test -
测试
-
编写测试代码
@RequestMapping
@RestController
public class TestController {
@GetMapping("test")
public String test(){
return "测试成功";
}
} -
进行访问测试
-
<font color = red>**SpringBoot内嵌的tomcat默认情况下启动HTTP服务,且SpringBoot可以在配置文件application.yaml中配置HTTP或HTTPS,切记是或,配置文件中不能同时配置HTTP和HTTPS**</font>
SpringBoot中同时配置HTTP和HTTPS
在SpringBoot中若要同时配置HTTP和HTTPS,那么至少有一种是需要通过编写程序方式配置的,在SpringBoot官方文档中,建议将HTTPS配置在配置文件
-
通过编程方式配置HTTP connector,然后重定向到HTTPS connector
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.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class TomcatHttpConfig {
/**
* 配置内置的servlet容器工厂为tomcat.
* @return
*/
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory(){
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection securityCollection = new SecurityCollection();
securityCollection.addPattern("/*");
securityConstraint.addCollection(securityCollection);
context.addConstraint(securityConstraint);
}
};
//添加连接配置,主要是http的配置信息.
tomcat.addAdditionalTomcatConnectors(initiateHttpConnector());
return tomcat;
}
/**
* 配置一个http连接信息.
* @return
*/
private Connector initiateHttpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8080);//Connector监听的http的端口号
connector.setSecure(false);
connector.setRedirectPort(443);//监听到http的端口号后转向到https的端口号
return connector;
}
} -
测试
启动应用程序,访问
http://127.0.0.1:8080/test
则会被重定向到https://127.0.0.1/test
注意问题
-
可能出现的问题
keytool error: java.io.IOException: parseAlgParameters failed: ObjectIdentifier() -- data isn't an object ID (tag = 48)
此报错代表你的java版本过低,我是从jdk1.8.0_271升级到 jdk1.8.0_321
本文由 mdnice 多平台发布
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。