spring tomcat spring-boot

spring boot add ssl certificate



¿Cómo puedo especificar mi archivo.keystore con Spring Boot y Tomcat? (5)

Estoy intentando configurar Spring Security para que funcione con la instancia incorporada de Tomcat de Spring Boot. Hay bastantes muestras básicas que hacen esto, pero estoy atascado donde lo dejan; realizan la autenticación básica a través de HTTP (no HTTPS).

Probablemente podría hacer que funcione si tuviera acceso a los archivos de configuración de Tomcat ( server.xml ) pero como Spring Boot usa una instancia de Tomcat incorporada (que de otra manera es una gran ventaja), no tengo acceso a los archivos de configuración de Tomcat (al menos , no que yo sepa).

Puede haber una configuración application.properties para esto, pero no he podido rastrearlo. He visto referencias a un campo server.contextPath en application.properties que sospecho que pueden tener algo que ver con el reemplazo de los archivos de configuración de Tomcat. Incluso si está relacionado, no sabría por dónde empezar de todos modos: todas las instrucciones SSL de Tomcat que he visto comienzan con la edición de un archivo server.xml existente, sin server.xml uno desde cero.

¿Se puede hacer esto con Spring Boot (especificando de algún modo un fragmento de server.xml o por otros medios)? Si no, ¿cuál sería la forma más sencilla de hacer esto? Entiendo que es posible que deba excluir el componente de Tomcat de Spring Boot, pero preferiría evitarlo si es posible.


Comenzando con Spring Boot 1.2, puede configurar SSL utilizando application.properties o application.yml . Aquí hay un ejemplo 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

Lo mismo con application.yml :

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

Aquí hay un enlace a la documentación de referencia actual .


Para keystores externos, prefijo con "file:"

server.ssl.key-store=file:config/keystore


Resulta que hay una manera de hacer esto, aunque no estoy seguro de haber encontrado el camino "apropiado", ya que esto requirió horas de lectura de código fuente de múltiples proyectos. En otras palabras, esto podría ser un montón de trabajo tonto (pero funciona).

Primero, no hay forma de obtener server.xml en el Tomcat integrado, ya sea para aumentarlo o reemplazarlo. Esto debe hacerse programáticamente.

En segundo lugar, la configuración ''require_https'' no ayuda, ya que no puede establecer la información del certificado de esa manera. Configura el reenvío de http a https, pero no le proporciona una forma de hacer que https funcione, por lo que el reenvío no es útil. Sin embargo, úselo con el material a continuación, que hace que https funcione.

Para comenzar, debe proporcionar un EmbeddedServletContainerFactory como se explica en los documentos de Embedded Servlet Container Support . Los documentos son para Java, pero Groovy se vería prácticamente igual. Tenga en cuenta que no he podido reconocer la anotación @Value utilizada en su ejemplo, pero no es necesaria. Para Groovy, simplemente coloque esto en un nuevo archivo .groovy e incluya ese archivo en la línea de comando cuando inicie spring arranque de spring .

Ahora, las instrucciones dicen que puede personalizar la clase TomcatEmbeddedServletContainerFactory que creó en ese código para que pueda alterar el comportamiento web.xml, y esto es cierto, pero para nuestros propósitos es importante saber que también puede usarlo para adaptar el server.xml comportamiento server.xml De hecho, al leer la fuente de la clase y compararla con los documentos Embedded Tomcat, verá que este es el único lugar para hacerlo. La función interesante es TomcatEmbeddedServletContainerFactory.addConnectorCustomizers() , que puede no parecer mucho de Javadocs, pero en realidad le da el objeto Embedded Tomcat para personalizarse. Simplemente pase su propia implementación de TomcatConnectorCustomizer y configure las cosas que desea en el Connector dado en la función de void customize(Connector con) el void customize(Connector con) . Ahora, hay alrededor de mil millones de cosas que puedes hacer con el Connector y no pude encontrar documentos útiles para él, pero la función createConnector() en este este proyecto personal de Spring-embedded-Tomcat es una guía muy práctica. Mi implementación terminó luciendo así:

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; } }

El Autowiring recogerá esta implementación y correrá con ella. Una vez que arreglé mi archivo de almacén de claves reventado (asegúrese de llamar keytool con -storetype pkcs12 , no -storepass pkcs12 como se informó en otro lugar), esto funcionó. Además, sería mucho mejor proporcionar los parámetros (puerto, contraseña, etc.) como ajustes de configuración para la prueba y tal ... Estoy seguro de que es posible si puede obtener la anotación @Value para trabajar con Groovy.


Si no desea implementar el connector customizer , puede compilar e importar la biblioteca ( https://github.com/ycavatars/spring-boot-https-kit ), que proporciona un connector customizer predefinido. Según el README, solo tiene que crear su almacén de claves, configurar connector.https.* , Importar la biblioteca y agregar @ComponentScan("org.ycavatars.sboot.kit") . Entonces tendrás conexión HTTPS.