Spring-boot configure client-auth = требуется дополнительный слушатель SSL - PullRequest
0 голосов
/ 26 апреля 2018

Я использую весеннюю загрузку версии 1.5.6. ВЫПУСК. Я настроил SSL на порт 9443 декларативно в application.yml. Это работает. Я также использую Undertow для этого приложения Spring-boot.

server:
session:
    cookie:
        http-only: true
contextPath: /webapp
port: 9443
ssl:
    key-store: /etc/pki/mycert.jks
    key-store-password: ${SSL_KEYSTORE_PWD}
    keyStoreType: JKS
    keyAlias: alias

Я настроил дополнительный порт SSL программно. Вот фрагмент кода:

@Configuration
public class UndertowAdditionalSSLConfig
{

@Bean
public UndertowEmbeddedServletContainerFactory embeddedServletContainerFactory()
{
    UndertowEmbeddedServletContainerFactory factory = new UndertowEmbeddedServletContainerFactory();
    factory.addBuilderCustomizers(new UndertowBuilderCustomizer()
    {
        @Override
        public void customize(Undertow.Builder builder)
        {
            try
            {
                builder.addHttpsListener(9444, "0.0.0.0", getSSLContext());
            }
            catch (Exception e)
            {
                log.error(e,"Could not add additional listener for https");
            }
        }

    });
    return factory;
  }
}

Вторичный ssl-порт используется для аутентификации клиента x509 для вызовов REST между серверами. Мне не удалось выяснить, как программно сделать следующее для вторичного порта ssl:

client-auth=need

Проблема, с которой я столкнулся, заключается в том, что клиентский сертификат не отправлен или не принят сервером. Я думаю, что я скучаю по этой части. Спасибо за любую помощь.

UPDATE

После некоторого поиска источника загрузки Spring. Я нашел это:

builder.setSocketOption(Options.SSL_CLIENT_AUTH_MODE, SslClientAuthMode.REQUIRED);

Я применил изменение к своему коду:

        @Override
        public void customize(Undertow.Builder builder)
        {
            try
            {
                builder.addHttpsListener(8444, "0.0.0.0", getSSLContext());
                builder.setSocketOption(Options.SSL_CLIENT_AUTH_MODE, SslClientAuthMode.REQUIRED);
            }
            catch (Exception e)
            {
                log.error(e,"Could not add additional listener for https");
            }
        }

Мне показалось, что у меня есть решение, которое я искал, однако изменение перешло и в SSL на порт 9443, и приложение перестало отвечать на запросы браузера.

Действительно, лучший вопрос для меня: Как я могу установить SSL на 2 отдельных порта и 1 принять сертификат клиента, чтобы могла выполняться аутентификация на основе клиента.

спасибо

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Вы должны установить client-auth:want в application.properties файле, как показано ниже:

server:
session:
    cookie:
        http-only: true
contextPath: /webapp
port: 9443
ssl:
    key-store: /etc/pki/mycert.jks
    key-store-password: ${SSL_KEYSTORE_PWD}
    keyStoreType: JKS
    keyAlias: alias
    client-auth: want

и затем программно откройте другой порт, как показано ниже:

@Configuration
public class UndertowAdditionalSSLConfig
{

@Bean
public UndertowEmbeddedServletContainerFactory embeddedServletContainerFactory()
{
    UndertowEmbeddedServletContainerFactory factory = new UndertowEmbeddedServletContainerFactory();
    factory.addBuilderCustomizers(new UndertowBuilderCustomizer()
    {
        @Override
        public void customize(Undertow.Builder builder)
        {
            try
            {
                builder.addListener(new Undertow.ListenerBuilder().setPort(8444)
                    .setType(Undertow.ListenerType.HTTPS)
                    .setSslContext(getSSLContext())
                    .setHost("0.0.0.0")
                    .setOverrideSocketOptions(OptionMap.create(Options.SSL_CLIENT_AUTH_MODE, SslClientAuthMode.REQUIRED)));
            }
            catch (Exception e)
            {
                log.error(e,"Could not add additional listener for https");
            }
        }
    });
    return factory;
  }
}

и если вы хотите использовать лямбда-выражения Java:

@Configuration
public class UndertowAdditionalSSLConfig {

    @Bean
    public UndertowEmbeddedServletContainerFactory embeddedServletContainerFactory() {
        UndertowEmbeddedServletContainerFactory factory = new UndertowEmbeddedServletContainerFactory();
        factory.addBuilderCustomizers((UndertowBuilderCustomizer) builder -> {
            try {
                builder.addListener(new Undertow.ListenerBuilder().setPort(8444)
                        .setType(Undertow.ListenerType.HTTPS)
                        .setSslContext(getSSLContext())
                        .setHost("0.0.0.0")
                        .setOverrideSocketOptions(OptionMap.create(Options.SSL_CLIENT_AUTH_MODE, SslClientAuthMode.REQUIRED)));
            } catch (Exception e) {
                log.error(e, "Could not add additional listener for https");
            }
        });
        return factory;
    }
}
0 голосов
/ 17 октября 2018

Вместо установки getSslContext в addHttpsListener методе builder, который настраивает весь sslContext, используемый всеми вашими коннекторами, вам нужно установить ssl на конкретный коннектор

public Ssl ssl() {
    Ssl ssl = new Ssl();
    ssl.setProtocol("TLS");
    ssl.setClientAuth(Ssl.ClientAuth.valueOf("need".toUpperCase()));
    // Other SSL stuff
    return ssl;
}

// Not sure where this function is for 1.5.6 spring boot, but for 1.5.2 it is a method of the container factory which you need to override
protected void customizeConnector(Connector aConnector) {
    final Ssl theSsl = ssl();
    // .. Other stuff to enable disable based on condition
    // turn on SSL for our connector
    theSsl.setEnabled(true);
    this.setSsl(theSsl);
    this.setPort(myConnector.getPort()); //otherwise customizeConnector will override port
}
...