Как проверить веб-токен JSON с помощью открытого ключа RSA?


Новый вопрос, чтобы этот вопрос был конкретным и по существу.

У меня есть JWT от Azure, и теперь мне нужно проверить подпись в моем приложении.

Открытые ключи от Microsoft можно найти здесь:

Https://login.windows.net/common/discovery/keys

Как я могу использовать эти ключи для проверки подписи? Я могу сказать, что это те открытые ключи, которые мне нужны, так как заголовок X5T в JWT соответствует тем, которые указаны в этом списке открытых ключей.

Я использую библиотека PHP JWT, но все, что я ввожу в качестве открытого ключа, похоже, терпит неудачу.

supplied key param cannot be coerced into a public key

Итак, используя ссылку выше, которая переходит оттуда в функцию PHP openssl_verify в качестве третьего параметра ($key в примере ниже)?

$success = openssl_verify($msg, $signature, $key, 'SHA256')

Все, что я ввожу, так или иначе вызывает ошибку.

Спасибо,

Author: pnuts, 2015-08-24

1 answers

Проблема решена.

Оказывается, что часть X5C массива JSON является сертификатом, а не открытым ключом, поэтому декодирование JSON https://login.windows.net/common/discovery/keys и захват элемента X5C и использование openssl для получения открытого ключа работает:

$cert_object = openssl_x509_read($cert);

$pkey_object = openssl_pkey_get_public(cert_object);

$pkey_array = openssl_pkey_get_details($pkey_object);

$publicKey = $pkey_array ['key'];

В этом примере $cert - это значение X5C. Однако этого само по себе недостаточно, так как оно не закодировано в X509. Итак, что я сделал, это создал новый файл в Windows под названием certificate.cer, открыл в блокноте и поместил X5C там есть ценность. Затем, дважды щелкнув на этом.cer в Windows, перейдя на вкладку "Сведения" и нажав "копировать в файл", откроется мастер экспорта сертификатов.

Экспортируйте как X509 и загрузите на сервер.

$cert = file_get_contents('Certificates/Public/public.cer');

Работает! Вероятно, есть более простой способ, но это работает.

 8
Author: Knightsbridge, 2015-08-24 15:58:42