Мое приложение представляет собой клиент 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




Проблема, с которой вы столкнулись, скорее всего, связана с тем, что сертификат, используемый Keycloak, не зарегистрирован в файле cacerts JRE, с которым работает ваше приложение Spring.
То, что вы настраиваете в своем приложении Spring, не имеет значения, здесь действительно важна конфигурация среды выполнения Java (и конфигурация Keycloak).
Таким образом, причина, по которой свойства Spring Boot для SSL игнорируются, заключается в том, что эти свойства используются для обслуживания контента из приложения Spring, и здесь вы потребляете данные из Keycloak.
Ошибка, с которой вы сталкиваетесь, возникает на очень низком уровне: sun.security, основной уровень безопасности среды выполнения Java (ниже слоев Spring). Использование одного и того же сертификата в Keycloak и в вашем приложении Spring не приведет к добавлению этого сертификата в среду выполнения Java.
Чтобы сгенерировать самозаверяющий сертификат и добавить его в cacerts каждого из JDK/JRE на вашем компьютере, вам может пригодиться этот мой скрипт.
В статьях, на которые вы ссылаетесь, может объясняться «как включить SSL в приложении Spring», а не «как подключить приложение Java (не обязательно Spring) к серверу (не обязательно Java) с самозаверяющим сертификатом». Обновил ответ.
Как всегда, ваше объяснение действительно помогает мне лучше понять!
Спасибо. "Симптомы" устранены, программа теперь работает. Я до сих пор не понимаю, почему свойства application.yaml неэффективны. Во всех статьях, которые я видел о том, как включить SSL, показано только создание самозаверяющего сертификата и добавление указателей в файл application.yaml. Я использую ваш сценарий, но я не собирался модифицировать IDE JDK.