Тестирование Spring boot x509 - pcf

В Cloud Foundry я настроил его так, чтобы сертификат клиента пересылался моему приложению весенней загрузки.

Сертификат помещается в заголовок x-forwarded-client-cert, приложение загрузки Spring читает это? И проверяет, внесен ли CN в белый список, и отправляет соответствующий ответ. К сожалению, я не могу воспроизвести это поведение с помощью теста. Я продолжаю получать (в отладочной информации):

"no client certificate found in request"

Я использую Будьте уверены, и мой тест выглядит так:

String cert = StreamUtils.copyToString(
  new ClassPathResource("certs/client/client_mod.crt").getInputStream(), Charset.defaultCharset());

cert = cert.replace("\r\n", "").replace("\n", "");

given()
  .spec(spec)
  .header("x-forwarded-client-cert", cert)
  .when()
  .get(HealthResource.BASE_URL + "/ip-reverse-lookup")
  .then()
  .statusCode(HttpStatus.OK.value());

Базовый uri для этого - http://localhost. Сертификат клиента «-----BEGIN CERTIFICATE-----" и "-----END CERTIFICATE-----" был удален, а символы новой строки удалены (как вы можете видеть в приведенном выше коде).

В моем application.yml у меня есть это:

server:
  ssl:
    enabled: false
    key-store:
    key-store-password:
    trust-store:
    trust-store-password:
    client-auth: need

Метод configure класса, расширяющего WebSecurityConfigurerAdapter, выглядит так:

http
  .x509()
  .subjectPrincipalRegex("CN=(.*?)(?:,|$)")
  .userDetailsService(customUserDetailsService)
  .and()
  .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER)
  .and()
  .csrf().disable();

Любая помощь / предложения будут оценены.

Спасибо.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
4
0
454
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из-за контейнерной и сетевой архитектуры вам необходимо принять во внимание следующие моменты при реализации и тестировании.

Когда вы настраиваете Cloud Foundry для проверки сертификатов клиентов (если они есть) на предмет надежности, они будут проверяться на соответствие доверенным центрам сертификации / сертификатам. Это делается на HAProxy общих сетевых компонентов ландшафта CF. И, как вы правильно утверждаете, он (если включен и доверяет) помещается в x-forwarded-client-cert, который защищен от изменений извне.

Ваше приложение работает в контейнере на более низком уровне и подключается к своему общедоступному имени хоста / URL-адресу через HAProxy / GoRouter. Когда запрос достигает вашего приложения, на этом этапе больше нет сертификата на уровне TLS (если быть точным, mTLS). SSL-соединение разорвано на HAProxy. Внутри ваше приложение / контейнер получает запрос как HTTP. Подробнее см. [1][2]

Итак, ваше приложение Spring просто получает информацию о сертификате X.509 / mTLS в заголовке, добавленном к запросу. Поэтому нет смысла добавлять / настраивать поддержку x509 в приложении Spring, так как настоящий mTLS никогда не достигнет конечной точки. Это также причина, по которой вы получаете сообщение журнала, опубликованное выше. Скорее вам нужно, чтобы ваше приложение считывало заголовок и выполняло свою логику на его основе.

Спасибо за этот ответ, я ценю это. Не могу вспомнить, как я поступил с этим впоследствии (в то время), но приведенное выше является хорошим объяснением.

Hurricane 05.11.2020 17:33

Другие вопросы по теме