Настройка HTTPS для весенней загрузки и swagger2

Я пытаюсь интегрировать свои приложения 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 или для весеннего загрузочного приложения? Я пропустил какие-либо необходимые шаги?

Не могли бы вы попробовать использовать .jks для параметра хранилища ключей.

Raheela Aslam 17.01.2019 13:42

@RaheelaAslam Пробовал использовать формат JKS, видите ту же ошибку. Генерация в формате JKS: «Предупреждение. Хранилище ключей JKS использует проприетарный формат. Рекомендуется перейти на PKCS12, который является отраслевым стандартным форматом, используя «keytool -importkeystore -srckeystore keystore.jks -destkeystore keystore.jks -deststoretype pkcs12». Мой думаю, что формат PKCS12 подходит?

user2777473 17.01.2019 14:14
Пользовательский скаляр 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
2
830
1

Ответы 1

Вы можете попробовать настроить bean-компонент Rest Template:

  1. Добавить зависимость:

     implementation 'org.apache.httpcomponents:httpclient:4.5'    
    
  2. Предоставьте 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);
        }
    }
  1. Укажите необходимые свойства SSL в файле application.properties или application.yaml:
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

В качестве альтернативы вы можете использовать мой стартер весенней загрузки

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