Spring Boot 结合 SSL

作者: 聪明的奇瑞 | 来源:发表于2017-12-29 13:44 被阅读476次

    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 请求重定向到 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

        本文链接:https://www.haomeiwen.com/subject/ggpigxtx.html