Почему значения yaml приложения загрузки Spring для SSL игнорируются?

Мое приложение представляет собой клиент Spring OAuth2, использующий keycloak в качестве сервера безопасности OAuth. Когда я настраиваю приложение на использование SSL, ему не удается подключиться к конечной точке конфигурации open-id. Я могу успешно подключиться к URL-адресу в браузере вне приложения/IDE.

После некоторой отладки я думаю, что это связано с тем, что он читает хранилище доверенных сертификатов по умолчанию из IDE, а не то, которое настроено в моем application.yaml.

Есть какие-нибудь предложения о том, что заставляет его игнорировать значения в application.yaml?

Спасибо, что нашли время прочитать и подумать над моим вопросом!

Ошибки

Caused by: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "https://localhost:8443/realms/MyRealm/.well-known/openid-configuration": PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
Caused by: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

application.yaml

server:
    port: 9443
    ssl:
        key-store-type: PKCS12
        key-store-password: ${self.signed.password}
        key-alias: tim-asus
        key-store: classpath:keystore/self_signed.p12
        enabled: true

Моя командная строка включает -Djavax.net.debug=all

Отладочный вывод

javax.net.ssl|DEBUG|22|restartedMain|2024-05-28 17:18:28.070 CDT|TrustStoreManager.java:113|trustStore is: C:\Users\me\.jdks\temurin-21.0.2\lib\security\cacerts
trustStore type is: pkcs12
Пользовательский скаляр 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 .
0
0
122
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Проблема, с которой вы столкнулись, скорее всего, связана с тем, что сертификат, используемый Keycloak, не зарегистрирован в файле cacerts JRE, с которым работает ваше приложение Spring.

То, что вы настраиваете в своем приложении Spring, не имеет значения, здесь действительно важна конфигурация среды выполнения Java (и конфигурация Keycloak).

Таким образом, причина, по которой свойства Spring Boot для SSL игнорируются, заключается в том, что эти свойства используются для обслуживания контента из приложения Spring, и здесь вы потребляете данные из Keycloak.

Ошибка, с которой вы сталкиваетесь, возникает на очень низком уровне: sun.security, основной уровень безопасности среды выполнения Java (ниже слоев Spring). Использование одного и того же сертификата в Keycloak и в вашем приложении Spring не приведет к добавлению этого сертификата в среду выполнения Java.

P.S.

Чтобы сгенерировать самозаверяющий сертификат и добавить его в cacerts каждого из JDK/JRE на вашем компьютере, вам может пригодиться этот мой скрипт.

Спасибо. "Симптомы" устранены, программа теперь работает. Я до сих пор не понимаю, почему свойства application.yaml неэффективны. Во всех статьях, которые я видел о том, как включить SSL, показано только создание самозаверяющего сертификата и добавление указателей в файл application.yaml. Я использую ваш сценарий, но я не собирался модифицировать IDE JDK.

Timothy Vogel 29.05.2024 02:10

В статьях, на которые вы ссылаетесь, может объясняться «как включить SSL в приложении Spring», а не «как подключить приложение Java (не обязательно Spring) к серверу (не обязательно Java) с самозаверяющим сертификатом». Обновил ответ.

ch4mp 29.05.2024 02:57

Как всегда, ваше объяснение действительно помогает мне лучше понять!

Timothy Vogel 29.05.2024 02:57

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