Я пытаюсь интегрировать свои приложения Sprint Boot с Keycloak, начиная с защищенной страницы swagger.
keytool помог мне создать самоподписанное хранилище ключей
keytool -genkey -alias abcdef -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
Я использую вышеизложенное для настройки ssl для приложения
server:
port: "15700"
ssl:
enabled: true
key-store: classpath:keystore.p12
key-store-password: password
key-alias: abcdef
keyStoreType: PKCS12
Без keycloak https для swagger работает как положено.
Я запустил keycloak из их образа докера, как показано ниже, экспортирую http и https
services:
keycloak:
image: jboss/keycloak
environment:
DB_VENDOR: POSTGRES
DB_ADDR: my.ip.address
DB_PORT: 5432
DB_DATABASE: keycloak
DB_USER: username
DB_PASSWORD: password
KEYCLOAK_USER: admin
KEYCLOAK_PASSWORD: password
ports:
- 8443:8443
- 8080:8080
Я прошу пользователя сначала войти в систему, когда он хочет получить доступ к документам swagger, поэтому я настраиваю keycloak, как показано ниже:
keycloak:
auth-server-url: "https://192.168.1.15:8443/auth"
realm: "DemoRealm"
public-client: true
resource: demo-app
security-constraints[0]:
authRoles[0]: "user"
securityCollections[0]:
name: "Demo App"
patterns[0]: "/swagger-ui.html"
Теперь незарегистрированный пользователь будет перенаправлен на страницу входа в keycloak, все работает отлично. Но после успешного входа в систему при перенаправлении обратно на страницу swagger приложения я получаю следующую ошибку:
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Если я настрою uri авторизации keycloak на http
keycloak:
auth-server-url: "http://192.168.1.15:8080/auth"
realm: "DemoRealm"
public-client: true
resource: demo-app
security-constraints[0]:
authRoles[0]: "user"
securityCollections[0]:
name: "Demo App"
patterns[0]: "/swagger-ui.html"
все работает отлично.
Является ли это проблемой конфигурации для keycloak или для весеннего загрузочного приложения? Я пропустил какие-либо необходимые шаги?
@RaheelaAslam Пробовал использовать формат JKS, видите ту же ошибку. Генерация в формате JKS: «Предупреждение. Хранилище ключей JKS использует проприетарный формат. Рекомендуется перейти на PKCS12, который является отраслевым стандартным форматом, используя «keytool -importkeystore -srckeystore keystore.jks -destkeystore keystore.jks -deststoretype pkcs12». Мой думаю, что формат PKCS12 подходит?




Вы можете попробовать настроить bean-компонент Rest Template:
Добавить зависимость:
implementation 'org.apache.httpcomponents:httpclient:4.5'
Предоставьте bean-компонент RestTemplate:
@Bean
private RestTemplate restTemplate() {
SSLContext sslContext = buildSslContext();
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext);
HttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(socketFactory)
.build();
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
return new RestTemplate(factory);
}
private SSLContext buildSslContext() {
try {
char[] keyStorePassword = sslProperties.getKeyStorePassword();
return new SSLContextBuilder()
.loadKeyMaterial(
KeyStore.getInstance(new File(sslProperties.getKeyStore()), keyStorePassword),
keyStorePassword
).build();
} catch (Exception ex) {
throw new IllegalStateException("Unable to instantiate SSL context", ex);
} finally {
sslProperties.setKeyStorePassword(null);
sslProperties.setTrustStorePassword(null);
}
}
server:
ssl:
enabled: true
key-store: /path/to/key.keystore
key-store-password: password
key-alias: alias
trust-store: /path/to/truststore
trust-store-password: password
В качестве альтернативы вы можете использовать мой стартер весенней загрузки
Не могли бы вы попробовать использовать .jks для параметра хранилища ключей.