Тестирование весенней загрузки x509 - pcf

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

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

"сертификат клиента не найден в запросе"

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

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();

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

Благодарю.

0 ответов

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

Когда вы настраиваете 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 никогда не достигнет конечной точки. Это также причина, по которой вы получаете сообщение журнала, опубликованное выше. Скорее вам нужно заставить ваше приложение читать заголовок и выполнять свою логику на его основе.

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