您现在的位置是:首页 >技术交流 >Spring Boot 使用SSL-HTTPS网站首页技术交流

Spring Boot 使用SSL-HTTPS

李沐泽 2024-06-17 11:27:56
简介Spring Boot 使用SSL-HTTPS

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指定创建的证书有效期(天)
alt
  • 在Springboot中启动HTTPS

    • 将生成的证书放到src/main/resources目录下

      通过上述方式生成的证书名为 test.p12 在当前用户目录下,即 C:Users当前用户名

      将该文件放到工程的src/main/resources目录下
alt
  • 在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 "测试成功";
          }
      }
    • 进行访问测试

alt
<font color = red>**SpringBoot内嵌的tomcat默认情况下启动HTTP服务,且SpringBoot可以在配置文件application.yaml中配置HTTP或HTTPS,切记是或,配置文件中不能同时配置HTTP和HTTPS**</font>

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

alt

注意问题

  • 可能出现的问题
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

本文由 mdnice 多平台发布

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。