Подтвердить что ты не робот

Как я могу указать файл .keystore с помощью Spring Boot и Tomcat?

Я пытаюсь настроить Spring Security для работы с Spring загруженным встроенным экземпляром Tomcat. Существует довольно много базовых образцов, которые делают это, но я застрял там, где они уходят - они выполняют базовую аутентификацию через HTTP (а не HTTPS).

Возможно, я мог бы сработать, если бы у меня был доступ к файлам конфигурации Tomcat (server.xml), но поскольку Spring Boot использует встроенный экземпляр Tomcat (который в противном случае является огромным удобством), у меня нет доступа к Tomcat файлы конфигурации (по крайней мере, насколько мне известно).

Для этого может быть параметр application.properties, но я не смог его отслеживать. Я видел ссылки на поле server.contextPath в application.properties, которое, как я подозреваю, может иметь какое-то отношение к замене файлов конфигурации Tomcat. Даже если это связано, я не знаю, с чего начать - все инструкции SSL Tomcat, которые я видел, начинаются с редактирования существующего файла server.xml, а не с нуля.

Можно ли это сделать с помощью Spring Boot (либо путем указания фрагмента server.xml, либо с помощью других средств)? Если нет, каков будет самый простой способ сделать это? Я понимаю, что мне может потребоваться исключить компонент Tomcat Spring Boot, но я предпочел бы избежать этого, если это возможно.

4b9b3361

Ответ 1

Оказывается, есть способ сделать это, хотя я не уверен, что нашел "правильный" способ, поскольку это потребовало часов чтения исходного кода из нескольких проектов. Другими словами, это может быть много немой работы (но это работает).

Во-первых, нет способа получить на server.xml во встроенном Tomcat, чтобы либо увеличить его, либо заменить. Это должно быть сделано программно.

Во-вторых, параметр "require_https" не помогает, поскольку вы не можете установить информацию о сертификате таким образом. Он настроил переадресацию с http на https, но это не дает вам способ заставить https работать, поэтому пересылка не является полезной. Однако используйте его с приведенным ниже материалом, что делает работу https.

Для начала вам необходимо предоставить EmbeddedServletContainerFactory, как описано в Документах поддержки контейнеров с встроенными сервлетами. Документы для Java, но Groovy будет выглядеть примерно так же. Обратите внимание, что я не смог заставить его распознать аннотацию @Value, используемую в их примере, но ее не нужно. Для groovy просто поместите это в новый файл .groovy и включите этот файл в командную строку при запуске spring boot.

Теперь инструкции говорят, что вы можете настроить класс TomcatEmbeddedServletContainerFactory, который вы создали в этом коде, чтобы вы могли изменять поведение web.xml, и это правда, но для наших целей важно знать, что вы также можете используйте его, чтобы настроить поведение server.xml. Действительно, читая исходный код для класса и сравнивая его с документами Embedded Tomcat, вы видите, что это единственное место для этого. Интересной функцией является TomcatEmbeddedServletContainerFactory.addConnectorCustomizers(), что может не сильно напоминать Javadocs, но на самом деле дает вам объект Embedded Tomcat для настройки самостоятельно. Просто передайте свою собственную реализацию TomcatConnectorCustomizer и задайте нужные вещи в заданном Connector в функции void customize(Connector con). Теперь с Connector есть около миллиарда вещей, и я не мог найти полезные документы для него, кроме функции createConnector() в этом этих ребятах персональных Spring Проект-сборник-Tomcat является очень практичным руководством. Моя реализация закончилась следующим образом:

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

Autowiring подберет эту реализацию с ней. Как только я исправил свой файл с архивом хранилища (убедитесь, что вы вызываете keytool с -storetype pkcs12, а не -storepass pkcs12, как сообщалось в другом месте), это сработало. Кроме того, было бы намного лучше предоставить параметры (порт, пароль и т.д.) В качестве параметров конфигурации для тестирования и т.д. Я уверен, что это возможно, если вы можете получить аннотацию @Value для работы с Groovy.

Ответ 2

Начиная с Spring Boot 1.2, вы можете настроить SSL с помощью application.properties или application.yml. Вот пример для application.properties:

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

То же самое с application.yml:

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

Здесь ссылка на текущую справочную документацию.

Ответ 3

Если вы не хотите реализовывать свой connector customizer, вы можете создавать и импортировать библиотеку (https://github.com/ycavatars/spring-boot-https-kit), которая обеспечивает предопределенные connector customizer. В соответствии с README вам нужно создать хранилище ключей, настроить connector.https.*, импортировать библиотеку и добавить @ComponentScan("org.ycavatars.sboot.kit"). Затем вы получите HTTPS-соединение.

Ответ 4

Для внешних хранилищ ключей префикс с файлом:

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