2015-02-04 32 views
5

Come devo configurare Jetty con il connettore SSL in Spring Boot 1.2.x?Jetty con SSL in Spring Boot 1.2.1

La seguente configurazione funziona per Spring boot 1.1.6 ma fornisce 'SslSocketConnector non può essere risolto con un errore' di tipo per la versione 1.2.1.

@Configuration 
@EnableAutoConfiguration 
public class OptosoftOAuthSecurityApplication implements 
     EmbeddedServletContainerCustomizer { 

    public static void main(String[] args) { 
     SpringApplication.run(OptosoftOAuthSecurityApplication.class, args); 
    } 

    @Override 
    public void customize(ConfigurableEmbeddedServletContainer container) { 
     if (container instanceof JettyEmbeddedServletContainerFactory) { 
      customizeJetty((JettyEmbeddedServletContainerFactory) container); 
     } 
    } 

    public void customizeJetty(
      JettyEmbeddedServletContainerFactory containerFactory) { 
     containerFactory.addServerCustomizers(jettyServerCustomizer()); 
    } 

    @Bean 
    public JettyServerCustomizer jettyServerCustomizer() { 
     return new JettyServerCustomizer() { 

      @Override 
      public void customize(Server server) { 
       SslContextFactory sslContextFactory = new SslContextFactory(); 
       sslContextFactory.setKeyStorePassword("jetty6"); 
       try { 
        sslContextFactory.setKeyStorePath(ResourceUtils.getFile(
          "classpath:jetty-ssl.keystore").getAbsolutePath()); 
       } catch (FileNotFoundException ex) { 
        throw new IllegalStateException("Could not load keystore", 
          ex); 
       } 

       // THIS CLASS cannot be resolved !!!!!! 
       SslSocketConnector sslConnector = new SslSocketConnector(
         sslContextFactory); 
       sslConnector.setPort(9443); 
       sslConnector.setMaxIdleTime(60000); 
       server.addConnector(sslConnector); 
      } 
     }; 
    } 

    @Bean 
    @ConditionalOnMissingBean(RequestContextListener.class) 
    public RequestContextListener requestContextListener() { 
     return new RequestContextListener(); 
    } 
} 

mio pom.xml (versione primavera Boot è 1.2.1 in POM genitore): -

<dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
      <exclusions> 
       <exclusion> 
        <artifactId>spring-boot-starter-tomcat</artifactId> 
        <groupId>org.springframework.boot</groupId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-jetty</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-security</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.security.oauth</groupId> 
      <artifactId>spring-security-oauth2</artifactId> 
     </dependency> 
    </dependencies> 

risposta

8

La classe che si sta tentando di utilizzare è specifico per Jetty 8 ma la primavera di avvio 1.2. x usa Jetty 9 per impostazione predefinita. In Spring Boot 1.2 è ora possibile configurare SSL in modo dichiarativo in application.properties. Questo è illustrato in spring-boot-sample-jetty-ssl.

È possibile sostituire il EmbeddedServletContainerCustomizer implementazione con le seguenti proprietà dichiarate in application.properties:

server.port = 9443 
server.ssl.key-store = classpath:jetty-ssl.keystore 
server.ssl.key-store-password = jetty6 

Primavera avvio supporta solo la configurazione dichiarativa di un singolo connettore. Se si desidera che il server sia accessibile tramite HTTP e HTTPS, è necessario configurarne uno a livello di programmazione. È consigliabile che il connettore HTTP sia configurato in modo programmatico in quanto è coinvolto meno codice:

@Bean 
public EmbeddedServletContainerCustomizer servletContainerCustomizer() { 
    return new EmbeddedServletContainerCustomizer() { 

     @Override 
     public void customize(ConfigurableEmbeddedServletContainer container) { 
      if (container instanceof JettyEmbeddedServletContainerFactory) { 
       configureJetty((JettyEmbeddedServletContainerFactory) container); 
      } 
     } 

     private void configureJetty(JettyEmbeddedServletContainerFactory jettyFactory) { 
      jettyFactory.addServerCustomizers(new JettyServerCustomizer() { 

       @Override 
       public void customize(Server server) { 
        ServerConnector serverConnector = new ServerConnector(server); 
        serverConnector.setPort(8080); 
        server.addConnector(serverConnector); 
       } 
      }); 
     } 
    }; 
} 
+0

Come fare Specificare la porta HTTP? –

+0

Vuoi configurare sia l'accesso HTTPS che quello HTTP? –

+0

Sì. Ho bisogno di entrambi. –