美文网首页springboot Https
springboot配置SSL以及HTTP转HTTPS

springboot配置SSL以及HTTP转HTTPS

作者: 上善若泪 | 来源:发表于2021-06-22 10:33 被阅读0次

    1 配置SSL

    1.1 SSL介绍

    SSL配置是我们在实际应用中经常见到的场景
    SSL(Secure Sockets Layer,安全套接层)是为忘了通信提供安全及数据完整性的一种安全协议,SSL在网络传送层对网络连接进行加密。SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通信提供安全支持。
    SSL协议可分为两层:

    • SSL记录协议(SSL Record Rrotocol),它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持
    • SSL握手协议(SSL Handshake Protocol),它建立在SSL记录协议之上,用于在实际数据传输开始前,通信双方进行身份认证、协商加密算法、交互加密密钥等

    在基于B/SWeb应用中,是通过HTTPS来实现SSL的。HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即在HTTP下加入SSL层,HTTPS的安全基础是SSL
    因为SpringBoot用的是内嵌的tomcat,因而我们做SSL配置的时候需要做如下的操作

    1.2 keytool生成证书

    使用SSL首先需要一个证书,这个证书既可以是自签名的,也可以是从SSL证书授权中心获得的。
    每一个JDK或者JRE里都有一个工具叫做keytool,它是一个证书管理工具,可以用来生成自签名的证书

    Keytool是一个Java数据证书的管理工具。Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里,包含两种数据:

    1. 密钥实体(Key entity)——密钥(secret key)又或者是私钥和配对公钥(采用非对称加密)
    2. 可信任的证书实体(trusted certificate entries)——只包含公钥

    keystore使用命令:

    keytool -genkey -alias tomcat -keyalg RSA   
    -keystore d:/mykeystore -dname "CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN" -keypass password 
    -storepass password -validity 36500
    

    参数说明:

    • -genkey表示要创建一个新的密钥
    • -dname表示密钥的Distinguished Names, CN=commonName
      OU=organizationUnit ,O=organizationName
      L=localityName ,S=stateName ,C=country
      Distinguished Names表明了密钥的发行者身份
    • -keyalg使用加密的算法,这里是RSA
    • -alias密钥的别名,每个keystore都关联这一个独一无二的alias,这个alias通常不区分大小写
    • -keypass私有密钥的密码,这里设置为password
    • -keystore 密钥保存在D:盘目录下的mykeystore文件中,在没有制定生成位置的情况下,keystore会存在与用户的系统默认目录, 文件名为.keystore
    • -storepass 存取密码,这里设置为password,这个密码提供系统从mykeystore文件中将信息取出
    • -validity该密钥的有效期为 36500表示100年 (默认为90天)

    1.3 cacerts证书

    cacerts证书文件(The cacerts Certificates File)
    改证书文件存在于java.home/lib/security目录下,是Java系统的CA证书仓库
    验证是否已创建过同名的证书

     keytool -list -v -alias tomcat -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass password
    

    1.4 springboot中配置

    server.ssl.key-store=classpath:tomcat_rsa.keystore
    server.ssl.key-alias=tomcat_rsa
    server.ssl.key-store-type=JKS
    server.ssl.key-store-password=123456
    

    注意:此处的classpath:tomcat_rsa.keystore是从项目中的相对路径来查找的,也可以从绝对路径查找

    1.5 报错ERR_SSL_VERSION_OR_CIPHER_MISMATCH

    SpringBoot配置ssl证书,访问提示ERR_SSL_VERSION_OR_CIPHER_MISMATCH
    在生成*.keystore时指定下 -keyalg RSA 可以避免此类问题
    或者在配置中添加字段属性

    server.ssl.ciphers=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,SSL_RSA_WITH_RC4_128_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
    

    2 HTTP转向HTTPS

    直接在浏览器地址栏里输入http对应端口号,然后自动跳转到https对应端口号

    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.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class HttpConfig {
        @Bean
        public Connector httpContector(){
            Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
            connector.setScheme("http");
            connector.setPort(8080);
            connector.setSecure(false);
            connector.setRedirectPort(8000);
            return connector;
        }
        @Bean
        public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector){
            TomcatServletWebServerFactory tomcat=new TomcatServletWebServerFactory(){
                @Override
                protected void postProcessContext(Context context) {
                    SecurityConstraint securityConstraint=new SecurityConstraint();
                    securityConstraint.setUserConstraint("CONFIDENTIAL");
                    SecurityCollection collection=new SecurityCollection();
                    collection.addPattern("/*");
                    securityConstraint.addCollection(collection);
                    context.addConstraint(securityConstraint);
                }
            };
            tomcat.addAdditionalTomcatConnectors(connector);
            return tomcat;
        }
    }
    

    启动成功后,可以见到


    在这里插入图片描述

    相关文章

      网友评论

        本文标题:springboot配置SSL以及HTTP转HTTPS

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