Конфигурация аутентификации клиента 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).