【问题标题】:How do I verify a JSON Web Token using a Public RSA key?如何使用公共 RSA 密钥验证 JSON Web 令牌?
【发布时间】:2015-11-18 01:12:02
【问题描述】:

新问题使这个问题保持具体和重点。

我有一个来自 Azure 的 JWT,现在我需要在我的应用程序中验证签名。

可以在此处找到来自 Microsoft 的公钥:

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

如何使用这些密钥来验证签名?我可以告诉这些是我需要的公钥,因为 JWT 中的 X5T 标头与此公钥列表中的标头匹配。

我正在使用 JWT PHP 库,但我作为公钥输入的所有内容似乎都失败了。

supplied key param cannot be coerced into a public key

所以使用上面的链接,从那里进入 PHP openssl_verify 函数作为参数三(下例中的$key)?

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

我输入的所有内容都会以某种方式导致错误。

谢谢,

【问题讨论】:

标签: php openssl rsa public-key-encryption


【解决方案1】:

问题解决了。

原来 JSON 数组的 X5C 部分是证书而不是公钥,因此 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 值放在那里。然后双击 Windows 中的 .cer,导航到详细信息选项卡并单击“复制到文件”,这将打开证书导出向导。

导出为 X509 并上传到服务器。

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

有效!可能有一种更简单的方法,但这很有效。

【讨论】:

    猜你喜欢
    • 2020-07-05
    • 2017-09-25
    • 1970-01-01
    • 2014-10-11
    • 2020-01-17
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    相关资源
    最近更新 更多