zoukankan      html  css  js  c++  java
  • 基于SpringBoot项目的https

    在spring中配置项目运行的端口很简单。

    在application.properties中

    server.port: 8080

    这样配置后,spring boot内嵌的tomcat服务器就是跑在8080端口启动http服务。但是如果在配置中启动https服务,用到的端口也是server.port。spring 不支持同时在配置中启动http和https。
    但是如果这样配置,项目只能走http协议。如果想让项目支持https协议,可以有两种方法。
    一:在配置中配置https的配置信息,http采用硬编码的方式
    二:用硬编码的方式来写https
    用硬编码的方式写https有点麻烦,所以一般都采用第一种方式。
    无论用哪种方式,想支持https,一定要生成一对秘钥。用openssl生成证书:

    openssl genrsa -out server.key 2048   //生成服务器端私钥
    
    openssl req -new -key server.key -out server.csr   //生成服务端证书请求文件 注意生成过程中需要你输入一些服务端信息
    openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server.crt //使用CA证书生成服务端证书  关于sha256,默认使用的是sha1,在新版本的chrome中会被认为是不安全的,因为使用了过时的加密算法。
    openssl pkcs12 -export -in server.crt -inkey server.key -out server.pkcs12  //打包服务端的资料为pkcs12格式(非必要,只是换一种格式存储上一步生成的证书)
    生成过程中,需要创建访问密码,请记录下来。
    keytool -importkeystore -srckeystore server.pkcs12 -destkeystore server.jks -srcstoretype pkcs12 //生成服务端的keystore(.jks文件, 非必要,Java程序通常使用该格式的证书)
    生成过程中,需要创建访问密码,请记录下来。 把ca证书放到keystore中(非必要) 
    keytool
    -importcert -keystore server.jks -file ca.crt

    生成证书后,让浏览器信任跟证书(ca.crt)。
    打开浏览器的设置。找到设置信任证书的部分。导入证书。
    准备工作完毕,看一下代码
    application.properties

    server.port: 8092
    server.ssl.key-store=/home/fzk/key/server.jks
    server.ssl.key-store-password=123456        //这个是在生成证书的时候设置的密码

    fzk.port:8091
    fzk.port:8091是自定义的名。因为不可能同时出现两个server.port

    同时支持http还需要一个java类
    HttpsConfiguration.java (名字自己随便起)

    import org.apache.catalina.connector.Connector;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
    import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class HttpsConfiguration {
      @Value("${fzk.port}")
      private int port;
    
      @Bean
      public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
        tomcat.addAdditionalTomcatConnectors(createHttpConnector());
        return tomcat;
      }
    
      private Connector createHttpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(port);
        connector.setSecure(false);
        return connector;
      }
    }

    @Configuration是spring的注解,表示这是一个配置。@Value("${fzk.port}")找到配置文件中的fzk.port赋值给int类型的port。还可以写成下面这样:

    @Configuration(prefix = "fzk")
    public class HttpsConfiguration {
      private int port;
      public void setPort(int port){
      this.port = port;
      }
      public int getPort(){
      return port;
      }
    }

    此时类中的属性名和配置文件中的名一定要对应上。

    这样就可以让项目同时支持http和https了。

    上面说了还有另外一种方法,采用硬编码https的请求的方式。

    配置文件中可以不用写服务端口号,直接看java类

    @Configuration
    public class HttpsConfiguration {
      @Bean
      public EmbeddedServletContainerCustomizer containerCustomizer() {
        return new EmbeddedServletContainerCustomizer() {
          @Override
          public void customize(ConfigurableEmbeddedServletContainer container) {
            Ssl ssl = new Ssl();
            // Server.jks中包含服务器私钥和证书
            ssl.setKeyStore("/home/fzk/key/server.jks");
            ssl.setKeyStorePassword("123456");
            container.setSsl(ssl);
            container.setPort(8092);
          }
        };
      }
    
      @Bean
      public EmbeddedServletContainerFactory servletContainerFactory() {
        TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory() {
          @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);
          }
        };
        factory.addAdditionalTomcatConnectors(createHttpConnector());
        return factory;
      }
    
      private Connector createHttpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setSecure(false);
        connector.setPort(8093);
        connector.setRedirectPort(8092);
        return connector;
      }
    }

    第一个bean的部分是使端口8092的https可以访问。下面的部分是让端口8093的http重定向到8092。

  • 相关阅读:
    2-4 Vue中的属性绑定和双向数据绑定
    MySQL索引失效的几种情况
    MySQL索引失效的几种情况
    Linux实现MYSQl数据库的定时备份
    Linux实现MYSQl数据库的定时备份
    你还在 Select * 吗?
    你还在 Select * 吗?
    世界顶级的程序员们告诉你:这些书都是你应该读的
    世界顶级的程序员们告诉你:这些书都是你应该读的
    真正努力和不努力的程序员,发朋友圈究竟有什么不一样?
  • 原文地址:https://www.cnblogs.com/badboyf/p/6145642.html
Copyright © 2011-2022 走看看