Я настраиваю поток OpenID для своего приложения и хочу проверить аутентификацию сертификата клиента JWT с закрытым ключом с помощью Microsoft Active Directory.То есть я хочу использовать сертификат, а не секреты клиента, для аутентификации моего приложения при запросе идентификаторов и токенов доступа.Однако при выполнении запроса токена я получаю следующую ошибку:
{
"error":"invalid_client",
"error_description":"AADSTS700027: Client assertion contains an invalid signature. [Reason - The key was not found., Please visit 'https://developer.microsoft.com/en-us/graph/graph-explorer' and query for 'https://graph.microsoft.com/beta/applications/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' to see configured keys]\r\nTrace ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\r\nCorrelation ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\r\nTimestamp: 2019-09-26 22:24:19Z",
"error_codes":[
700027
],
"timestamp":"2019-09-26 22:24:19Z",
"trace_id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"correlation_id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"error_uri":"https://login.microsoftonline.com/error?code=700027"
}
Я создаю закрытый ключ и сертификат, используя следующую команду:
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes
Я загрузил cert.pem
для регистрации моего приложения на портале Azure.
В моем приложении я использую библиотеку Nimbus JOSE + JWT для создания JWT и Nimbus OAuth 2.0 SDKс расширениями OpenID Connect для управления потоком OpenID.Вот страницы Javadoc для каждого из этих пакетов соответственно:
Я проверил, что ключ иСертификаты имеют формат PEM, проверив, что они содержат заголовки -----BEGIN PRIVATE KEY-----
и -----BEGIN CERTIFICATE-----
и соответствующие нижние колонтитулы.
Согласно ошибке, я посетил https://developer.microsoft.com/en-us/graph/graph-explorer, вошел в систему слева, а затем отправил запрос, используя данный неотредактированный URL.Это дало мне ошибку:
{
"error": {
"code": "Request_ResourceNotFound",
"message": "Resource 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' does not exist or one of its queried reference-property objects are not present.",
"innerError": {
"request-id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"date": "2019-09-26T23:47:37"
}
}
Моя текущая реализация выглядит следующим образом.
val privateKeyString = File(keyFilePath).readText()
val certificateString = File(certFilePath).readText()
val certObject = JWK.parseFromPEMEncodedX509Cert(certificateString)
val privateKeyJWK = JWK.parseFromPEMEncodedObjects(privateKeyString)
val privateKey = RSAKey.parse(privateKeyJWK.toJSONObject())
val privateKeyJWT = PrivateKeyJWT(
ClientID(configuration.clientId), // clientId retrieved from the app reg on the azure portal
providerMetadata.tokenEndpointURI, // login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/oauth2/token
JWSAlgorithm.RS256,
privateKey.toRSAPrivateKey(),
certObject.keyID,
null)
val tokenReq = TokenRequest(
providerMetadata.tokenEndpointURI,
privateKeyJWT,
AuthorizationCodeGrant(authCode, // authCode received from previous step of the OpenID flow
URI(configuration.redirectURI)) // the application's login page. This has been registered in
// the app reg on the azure portal.
)
val tokenHTTPResponse: HTTPResponse? = tokenReq.toHTTPRequest().send()
val tokenResponse = OIDCTokenResponse.parse(tokenHTTPResponse) // response fails with the described error
Здесь есть несколько шагов, которые могут пойти не так, но я не смогсузьте его:
- Мой ключ может быть неправильным.Возможно, я использую ключ и сертификат, который не соответствует ожидаемому формату?
- Мой синтаксический анализ ключей с использованием библиотеки Nimbus может быть неправильным.Прохождение кода во время запроса и проверка объектов данных, кажется, указывает на то, что он анализирует все компоненты из файла.Неясно, правильно ли выполняется синтаксический анализ этих компонентов.
- Моя конструкция закрытого ключа JWT может быть ошибочной.
- Возможно, конструкция запроса токена неверна.
- Конфигурация регистрации моего приложения на портале Azure может быть неправильной.
Будем весьма благодарны за любые указания относительно того, как сузить или решить эту проблему!