SSL 安全套接字
- 超文本传输协议(HTTP)是以纯文本形式传输数据,这样并不安全
- SSL(安全套接层),及其继任者传输安全(TLS)是为网络通信提供安全及数据完整的一种安全协议,在传输层对网络进行加密,确保数据在网络传输过程中不会被截取与监听
- SSL 与 HTTP 结合提供了 HTTP 安全性的实现,称之为安全超文本传输协议(HTTPS),它确保了被访问网站的真实性,此安全性围绕着托管应用程序的服务器,用户的及其,以及第三方信任存储服务器之间签名的数字证书
SSL 的流程
- 客户向服务器发送一个请求 http://twitter.com
- 服务器使用 HTTP 代码 302 将请求重定向到 https://twitter.com
- 客户端链接到 https://twitter.com,并且在响应中,服务器把数字签名证书提供给客户端
- 客户端接收该证书,并将其发送到证书颁发机构进行认证(CA)
- 一旦证书通过 CA 认证,客户端与服务器之间就建立起了加密通信
SSL 特点
- 加密用户和服务器,确保数据发送到正确的客户机和服务器
- 加密数据以防止数据中途被窃取
- 维护数据的完整性。确保数据在传输过程中不会被改变
Spring Boot 启动 HTTPS
获取 SSL 证书,自己生成或证书机构购买,这里通过 keytool 生成,生成后会保存在 HOME 目录下
keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
-genkey:生成key
-alias:key的别名
-dname:证书拥有者信息
-storetype:密钥的类型,可选值有 JKS、JCEKS、PKCS12、BKS、UBER
-keyalg:DSA或RSA算法
-keySize:密钥长度
-keystore:证书名称
-validity:证书有效期天数
修改配置文件
#https端口号.
server:
port: 8090
#证书的路径.
ssl:
key-store: classpath:keystore.p12
#证书密码,请修改为您自己证书的密码.
key-store-password: 123456
#秘钥库类型
keyStoreType: PKCS12
#证书别名
keyAlias: tomcat
测试
- 添加一个简单的控制器
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello";
}
}
- 访问 http://localhost:8090/hello 时会失败,访问 https://localhost:8090/hello 时成功
将 HTTP 请求重定向到 HTTPS
@Configuration
public class TomcatHttpConfig {
/**
* 配置嵌入式的servlet容器工厂为自定义配置tomcat.
* @return
*/
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
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(8091);
connector.setSecure(false);
connector.setRedirectPort(8090);
return connector;
}
}
测试:访问 http://localhost:8091/hello 时会重定向到 https://localhost:8090/hello