您的位置:

SpringBoot配置HTTPS

一、SpringBoot配置文件

通过配置文件来进行HTTPS配置是最常见的方式。SpringBoot提供了方便的配置方式,在application.properties或者application.yml中配置即可。

application.properties文件配置示例

    server.port=8443
    server.ssl.key-store-type=PKCS12
    server.ssl.key-store=classpath:keys/keystore.p12
    server.ssl.key-store-password=password
    server.ssl.key-alias=tomcat

application.yml文件配置示例

    server:
      port: 8443
      ssl:
        key-store-type: PKCS12
        key-store: classpath:keys/keystore.p12
        key-store-password: password
        key-alias: tomcat

在上面的示例中,我们指定了服务的端口为8443,选择了key-store-type为PKCS12格式,key-store指向classpath下的keystore.p12文件,key-store-password指定了密码,key-alias指定了证书的别名。

二、SpringBoot配置SSL

SpringBoot默认开启了SSL,如果需要关闭,可以在application.properties中设置server.ssl.enabled=false。

如果需要自定义SSL配置,可以通过编码实现。在SpringBoot2.0之前,可以通过配置ServerProperties来实现SSL的配置。

示例:

@Configuration
public class SslConfig extends WebServerFactoryCustomizerConfigurableWebServerFactory> {
    @Override
    public void customize(WebServerFactory factory) {
        Ssl ssl = new Ssl();
        // Server.jks中包含了https证书和私钥;keystore.password是证书密码
        //,请确保修改为自己证书的密码
        ssl.setKeyStore("classpath:server.jks");
        ssl.setKeyStorePassword("keystore.password");
        factory.setSsl(ssl);
        factory.setPort(8443);
    }
}

在SpringBoot2.0中,使用SslStoreProvider来进行SSL的配置。

SslStoreProvider

@Component
public class SslServerProvider implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>{
    @Autowired
    private SslPropertiesConfig sslPropertiesConfig;
    @Override
    public void customize(ConfigurableServletWebServerFactory factory) {
        sslPropertiesConfig.getSsl().setSslProvider(SslProvider.OPENSSL);
        sslPropertiesConfig.getSsl().setKeyStore(new ClassPathResource("server.jks"));
        sslPropertiesConfig.getSsl().setKeyStorePassword("keystore.password");
        factory.setSsl(sslPropertiesConfig.getSsl());
    }
}

三、SpringBoot配置类

通过配置类进行SSL的配置是比较灵活的方式。可以通过注入的方式对SSL具体参数进行配置。其中SSL的配置参数可以在SslConfiguration中进行配置。

示例:

@Configuration
public class SslConfiguration {

    @Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> webServerFactoryCustomizer() {
        return (factory) -> {
            Ssl ssl = getSsl();
            ssl.setCiphers(Arrays.asList("TLS_RSA_WITH_AES_128_CBC_SHA256", "TLS_RSA_WITH_AES_128_CBC_SHA"));
            factory.setSsl(ssl);
        };
    }

    public Ssl getSsl() {
        Ssl ssl = new Ssl();
        ssl.setKeyStore("classpath:server.jks");
        ssl.setKeyStorePassword("server-password");
        ssl.setKeyAlias("server-key-alias");
        return ssl;
    }
}

四、SpringBoot配置中心

如果需要在更改参数的情况下动态刷新SSL的配置,可以使用Spring Cloud Config等工具,将SSL配置参数进行热更新。

五、SpringBoot配置顺序

对于SpringBoot来说,不同的配置方式有不同的优先级。按照优先级的顺序,配置顺序依次是:

  • Embedded Servlet Container Customizer Bean
  • 命令行参数
  • JNDI属性
  • ServletWebServerFactory配置的ContextParameters
  • ServletContextInitializer Beans
  • SpringApplicationBuilder的properties方法
  • application.properties文件中的属性
  • application.yml文件中的属性

六、SpringBoot配置原理

SpringBoot的SSL配置原理是通过在ServerProperties中封装了Ssl、SslStoreProvider等操作。同时,ServerProperties中也提供了一些默认的SSL配置。

七、SpringBoot常用配置

  • HTTPS配置:server.ssl.key-store(key-store文件路径)、server.ssl.key-store-password(key-store密码)、server.ssl.key-alias(别名)等
  • HTTP端口配置:server.port(端口号)
  • Context Path配置:server.servlet.context-path(应用上下文的路径)
  • 连接超时配置:server.connection-timeout(连接超时时间)
  • 线程池配置:server.tomcat.max-threads(最大线程数)、server.tomcat.min-spare-threads(最小空闲线程数)等