Как проверить веб-токен 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')
Все, что я ввожу, так или иначе вызывает ошибку.
Спасибо,
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');
Работает! Вероятно, есть более простой способ, но это работает.