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