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 "测试成功"; } }
-
进行访问测试
SpringBoot内嵌的tomcat默认情况下启动HTTP服务,且SpringBoot可以在配置文件application.yaml中配置HTTP或HTTPS,切记是或,配置文件中不能同时配置HTTP和HTTPS
-
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