Como posso especificar meu arquivo .keystore com a Primavera de inicialização e Tomcat?

votos
33

Eu estou tentando configurar Spring Security trabalhar com instância Tomcat incorporado de Primavera de inicialização. Há algumas amostras básicas que fazer isso, mas eu estou preso onde saem fora - eles fazem a autenticação básica sobre HTTP (não HTTPS).

Eu provavelmente poderia fazê-lo funcionar se eu tivesse acesso aos arquivos de configuração do Tomcat ( server.xml), mas desde a Primavera de inicialização usa uma instância Tomcat embutido (que é de outra forma uma enorme conveniência), eu não tenho acesso aos arquivos de configuração do Tomcat (pelo menos, não para meu conhecimento).

Pode haver uma application.propertiesdefinição para isso, mas eu não tenho sido capaz de rastreá-lo. Já vi referências a um server.contextPathcampo em application.propertiesque eu suspeito que pode ter algo a ver com os arquivos de configuração de substituição do Tomcat. Mesmo se ela está relacionada, eu não saberia por onde começar de qualquer maneira - todas as instruções SSL do Tomcat que eu vi começar com a edição de um existente server.xmlarquivo, e não construir um do zero.

Isso pode ser feito com a Primavera de inicialização (ou por alguma forma especificar um trecho de server.xmlou através de outros meios)? Se não, qual seria a maneira mais simples de fazer isso? Eu entendo que pode precisar excluir o componente Tomcat de Primavera Bota mas eu prefiro para evitar que se possível.

Publicado 27/10/2013 em 01:57
fonte usuário
Em outras línguas...                            


5 respostas

votos
17

Acontece que há uma maneira de fazer isso, embora eu não tenho certeza que eu encontrei a maneira 'apropriada' uma vez que este horas necessárias de leitura de código fonte de vários projetos. Em outras palavras, isso pode ser um monte de trabalho mudo (mas funciona).

Em primeiro lugar, não há nenhuma maneira de obter no server.xml no Tomcat embutido, quer para aumentá-lo ou substituí-lo. Isso deve ser feito por meio de programação.

Em segundo lugar, a definição dos require_https 'não ajuda, já que não é possível definir informações cert dessa forma. Ele não configurar o encaminhamento de http para https, mas não lhe dá uma maneira de fazer https trabalhar para que o is not forwarding útil. No entanto, usá-lo com o material abaixo, que faz tornar o trabalho https.

Para começar, você precisa fornecer um EmbeddedServletContainerFactorycomo explicado nos documentos de apoio Servlet Container incorporados . Os documentos são para Java, mas o Groovy ficaria praticamente o mesmo. Note que eu não tenho sido capaz de obtê-lo a reconhecer a @Valueanotação usada em seu exemplo, mas não é necessário. Para groovy, basta colocar isso em um novo arquivo .groovy e incluir esse arquivo na linha de comando quando você iniciar springboot.

Agora, as instruções dizem que você pode personalizar a TomcatEmbeddedServletContainerFactoryclasse que você criou na esse código para que você possa alterar o comportamento web.xml, e isso é verdade, mas para os nossos propósitos é importante saber que você também pode usá-lo para adequar server.xmlo comportamento. Na verdade, lendo a fonte para a classe e comparando-a com os docs Tomcat integrado, você vê que este é o único lugar para fazer isso. A função interessante é TomcatEmbeddedServletContainerFactory.addConnectorCustomizers(), que não pode olhar como muito com os Javadocs mas realmente dá-lhe o objeto Tomcat incorporado para personalizar-se. Simplesmente passar sua própria implementação TomcatConnectorCustomizere definir as coisas que você quer em um determinado Connectorna void customize(Connector con)função. Agora, há cerca de um bilhão de coisas que você pode fazer com o Connectore eu não poderia encontrar docs úteis para ele, mas ocreateConnector()função neste este caras projeto-Tomcat incorporado-Spring pessoal é um guia muito prático. Minha implementação acabou com essa aparência:

package com.deepdownstudios.server

import org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory
import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.*
import org.springframework.stereotype.*

@Configuration
class MyConfiguration {

@Bean
public EmbeddedServletContainerFactory servletContainer() {
final int port = 8443;
final String keystoreFile = "/path/to/keystore"
final String keystorePass = "keystore-password"
final String keystoreType = "pkcs12"
final String keystoreProvider = "SunJSSE"
final String keystoreAlias = "tomcat"

TomcatEmbeddedServletContainerFactory factory = 
        new TomcatEmbeddedServletContainerFactory(this.port);
factory.addConnectorCustomizers( new TomcatConnectorCustomizer() {
    void    customize(Connector con) {
        Http11NioProtocol proto = (Http11NioProtocol) con.getProtocolHandler();
            proto.setSSLEnabled(true);
        con.setScheme("https");
        con.setSecure(true);
        proto.setKeystoreFile(keystoreFile);
        proto.setKeystorePass(keystorePass);
        proto.setKeystoreType(keystoreType);
        proto.setProperty("keystoreProvider", keystoreProvider);
        proto.setKeyAlias(keystoreAlias);
    }
});
return factory;
}
}

O autowiring vai pegar essa implementação uma corrida com ele. Uma vez que eu fixo meu arquivo de armazenamento de chaves preso (certifique-se de chamar keytool com -storetype pkcs12, e não -storepass pkcs12como relatado em outros lugares), isso funcionou. Além disso, seria muito melhor para fornecer os parâmetros (porto, senha, etc.) como definições de configuração para testes e tal ... Eu tenho certeza que é possível se você pode obter a anotação @value para trabalhar com Groovy.

Respondeu 28/10/2013 em 05:44
fonte usuário

votos
0

Se você não quiser implementar o seu connector customizer, você pode criar e importar a biblioteca ( https://github.com/ycavatars/spring-boot-https-kit ) que fornece pré-definido connector customizer. De acordo com o README, você só tem que criar seu armazenamento de chaves, configurar connector.https.*, importar a biblioteca e adicionar @ComponentScan("org.ycavatars.sboot.kit"). Então você terá conexão HTTPS.

Respondeu 11/06/2014 em 08:53
fonte usuário

Respondeu 22/06/2014 em 16:10
fonte usuário

votos
46

Começando com Spring Bota 1.2, você pode configurar SSL usando application.propertiesou application.yml. Aqui está um exemplo para application.properties:

server.port = 8443
server.ssl.key-store = classpath:keystore.jks
server.ssl.key-store-password = secret
server.ssl.key-password = another-secret

A mesma coisa com application.yml:

server:
  port: 8443
  ssl:
    key-store: classpath:keystore.jks
    key-store-password: secret
    key-password: another-secret

Aqui está um link para a documentação de referência atual .

Respondeu 29/08/2014 em 07:44
fonte usuário

votos
6

Para keystores externos, prefixo com "file:"

server.ssl.key-store=file:config/keystore 
Respondeu 15/12/2017 em 08:50
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more