Новый вопрос, чтобы этот вопрос был конкретным и точным.
У меня есть JWT от Azure, и теперь мне нужно проверить подпись в моем приложении.
Открытые ключи от Microsoft можно найти здесь:
https://login.windows.net/common/discovery/keys
Как использовать эти ключи для проверки подписи? Я могу сказать, что это открытые ключи, которые мне нужны, поскольку заголовок X5T в JWT совпадает с заголовками этого открытого списка.
Я использую JWT-библиотеку PHP, но все, что я ввожу, поскольку открытый ключ, кажется, терпит неудачу.
supplied key param cannot be coerced into a public key
Итак, используя ссылку выше, которая идет оттуда в функцию openssl_verify PHP как параметр три (ключ $ в примере ниже)?
$success = openssl_verify($msg, $signature, $key, 'SHA256')
Все, что я вводил, вызывает ошибку так или иначе.
Благодаря,
Задача решена.
Оказывается, что часть 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. Так что я сделал, это создать новый файл в окнах под названием certificate.cer, открыть в блокноте и поставить там значение X5C. Затем, дважды щелкнув по октету в окнах, перейдя на вкладку сведений и нажав «скопировать в файл», откроется мастер экспорта сертификатов.
Экспорт как X509 и загрузка на сервер.
$cert = file_get_contents('Certificates/Public/public.cer');
Работает! Вероятно, есть более простой способ, но это работает.