Spring Boot 结合 SSL

SSL 安全套接字

  • 超文本传输协议(HTTP)是以纯文本形式传输数据,这样并不安全
  • SSL(安全套接层),及其继任者传输安全(TLS)是为网络通信提供安全及数据完整的一种安全协议,在传输层对网络进行加密,确保数据在网络传输过程中不会被截取与监听
  • SSL 与 HTTP 结合提供了 HTTP 安全性的实现,称之为安全超文本传输协议(HTTPS),它确保了被访问网站的真实性,此安全性围绕着托管应用程序的服务器,用户的及其,以及第三方信任存储服务器之间签名的数字证书

SSL 的流程

  1. 客户向服务器发送一个请求 http://twitter.com
  2. 服务器使用 HTTP 代码 302 将请求重定向到 https://twitter.com
  3. 客户端链接到 https://twitter.com,并且在响应中,服务器把数字签名证书提供给客户端
  4. 客户端接收该证书,并将其发送到证书颁发机构进行认证(CA)
  5. 一旦证书通过 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

你可能感兴趣的:(Spring Boot 结合 SSL)