В 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();
Любая помощь / предложения будут оценены.
Спасибо.




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