`
234390216
  • 浏览: 10192242 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:460747
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1771676
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1395339
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:393855
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:678187
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:529242
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1178648
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:461678
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:150089
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:66813
社区版块
存档分类
最新评论

Spring Boot(26)——启用https协议

阅读更多

启用Https

启用Https协议,需要在服务端有一个证书。开发环境可以在通过如下指令生成一个证书及其KeyStore。

keytool -genkeypair -alias springboot -keyalg RSA -dname "CN=SERVER1,OU=Unit,O=Elim,L=City,S=Province,C=CN" -keypass 123456 -keystore server.jks -storepass 123456 -storetype jks

上面指令会在当前路径下生成一个名为server.jks的KeyStore。我们可以把它放到我们的Spring Boot工程中,然后在Spring Boot的application.properties中通过server.ssl.xxx指定启用Https相关的配置信息。下面的属性都很好理解,笔者就不再赘述了。

server.ssl.enabled=true
server.ssl.keyAlias=springboot
server.ssl.keyPassword=123456
server.ssl.keyStorePassword=123456
server.ssl.keyStore=classpath:config/server.jks
server.ssl.keyStoreType=JKS

这样当重新启动应用后,再访问应用就只能通过https协议访问了。假设我们希望同时开启http和https协议访问,那么它们需要在不同的端口上。我们之前已经启用了https协议,假设是监听在端口8888上,现在我们需要开启一个http协议,监听在8081端口上。那么我们可以定义一个TomcatServletWebServerFactory类型的bean,通过它额外添加一个通过http协议监听在8081端口的Connector,比如下面这样。

@Configuration
public class TomcatConfiguration {

  @Bean
  public TomcatServletWebServerFactory servletContainer(){
    TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
    tomcat.addAdditionalTomcatConnectors(this.httpConnector());
    return tomcat;
  }

  private Connector httpConnector(){
    Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
    connector.setScheme("http");
    connector.setPort(8081);
    connector.setSecure(false);
    return connector;
  }

}

这样我们的应用就可以同时通过http://localhost:8081https://localhost:8888访问了。如果我们希望同时开启http和https协议,但是当用户通过http协议访问时我们强制它通过https协议访问。则可以把我们的TomcatServletWebServerFactory定义成如下这样。它通过对Context的自定义指定了必须通过https协议访问,在Connector中指定了http协议访问时跳转到8888端口。

@Configuration
@Profile("https")
public class TomcatConfiguration {

  @Bean
  public TomcatServletWebServerFactory servletContainer(){
    TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
    tomcat.addContextCustomizers(context -> {
      SecurityConstraint securityConstraint = new SecurityConstraint();
      securityConstraint.setUserConstraint("CONFIDENTIAL");
      SecurityCollection collection = new SecurityCollection();
      collection.addPattern("/*");
      securityConstraint.addCollection(collection);
      context.addConstraint(securityConstraint);
    });
    tomcat.addAdditionalTomcatConnectors(redirectConnector());
    return tomcat;
  }

  private Connector redirectConnector(){
    Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
    connector.setScheme("http");
    connector.setPort(8081);
    connector.setSecure(false);
    connector.setRedirectPort(8888);
    return connector;
  }

}

 

参考文档

https://memorynotfound.com/spring-boot-configure-tomcat-ssl-https/

(注:本文基于Spring Boot 2.0.3所写)

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics