Конфигурация аутентификации клиента Keycloak x509

Мне нужны несколько советов, чтобы понять, как выполнить аутентификацию клиента с сертификатом x509 против Keycloak.

У нас есть простое веб-приложение Spring Boot (API REST) ​​в кластере Kubernetes. Это веб-приложение является общедоступным, доступным через API-шлюз (Ambassador) и в настоящее время защищено перенаправлением браузера на страницу входа в Keycloak, где пользователь может ввести свое имя пользователя и пароль.

Однако это не то, чего мы хотим. Нам необходима аутентификация клиента (React Native Mobile App), где:

  • Мобильное приложение пытается вызвать наши конечные точки REST API сервера
  • Посол проверяет действительный токен доступа и (если нет) отвечает со статусом 403 http (без перенаправления браузера)
  • Затем мобильное приложение перенаправляет на Keycloak для выполнения аутентификации.
  • Keycloak не отображает страницу входа в систему с именем пользователя и паролем, а вместо этого мобильное приложение передает сертификат пользователя x509 через свой браузер.

К сожалению, я не могу понять, как создать действительный и доверенный сертификат x509 с данными пользователя (информация, роли и т. Д.), Чтобы получить токен доступа от IdP.

И... как IdP может проверить и подтвердить этот сертификат клиента? Нужен ли где-нибудь на Keycloak дубликат сертификата сервера?

Какая правильная форма (например, с CURL) для передачи клиентского сертификата в keycloak? Обязательно ли передавать закрытый ключ и почему?

2 ответа

К сожалению, я не могу понять, как создать действительный и доверенный сертификат x509 с данными пользователя (информация, роли и т. Д.), Чтобы получить токен доступа от IdP.

Посмотрите эту статью, чтобы сгенерировать сертификат Как создать самоподписанный сертификат с OpenSSL

Как IdP может проверить и подтвердить этот сертификат клиента?

Документация Keycloak является хорошей отправной точкой, проверьте "Добавление аутентификации сертификата клиента X.509 в поток браузера" и "Добавление аутентификации сертификата клиента X.509 в поток прямого предоставления", если вам нужен полный DN для ключа пользователя, вы можете использовать этот RegEx в конфигурации X509:

  • установить "Регулярное выражение для извлечения личности пользователя": (.*)
  • добавьте, например, атрибут пользователя, называемый "сертификат пользователя", и скопируйте в него DN.

Нужен ли где-нибудь на Keycloak дубликат сертификата сервера?

Не все сертификаты, вы можете добавить только DN в пользовательский атрибут пользователя под названием "usercertificate".

Какая правильная форма (например, с CURL) для передачи клиентского сертификата в keycloak?

URL: https: // localhost:9445 / auth / realms // протокол /openid-connect/ токен

Пример кода для открытия сеанса TLS Keycloak:

public String openSession(
        File p12File, 
        String passphrase,
        String clientId) 
throws IOException, GeneralSecurityException {

    try (FileInputStream fis = new FileInputStream(p12File);) {
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        keyStore.load(new FileInputStream(p12File), passphrase.toCharArray());
        
        HttpClient httpClient = HttpClients
                .custom()
                .setSSLContext(new SSLContextBuilder()
                        .loadTrustMaterial(null, TrustAllStrategy.INSTANCE)
                        .loadKeyMaterial(keyStore, passphrase.toCharArray())
                        .build())
                .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
                .build();
        
        HttpPost httpPost = new HttpPost(tokenEndpoint);
        httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");

        String data = "grant_type=password" + "&client_id="+ clientId;
        StringEntity input = new StringEntity(data);
        httpPost.setEntity(input);

        HttpResponse response = httpClient.execute(httpPost);
        return IOUtils.toString(response.getEntity().getContent(), "UTF-8");
    }
}

Обязательно ли передавать закрытый ключ и почему?

нет

Пожалуйста, проверьте раздел Аутентификация пользователя сертификата клиента X.509 в разделе 6 Руководства по администрированию сервера Keycloak, в котором описывается:

  • как включить и настроить аутентификацию сертификата клиента в Wildfly и Keycloak
  • как сопоставить поля сертификата с атрибутами пользователя
  • рабочий процесс аутентификации сертификата клиента с помощью Keycloak/Wildfly (контейнер Keycloak).
Другие вопросы по тегам