如何使用 Public RSA 密钥验证 JSON Web 令牌?

How do I verify a JSON Web Token using a Public RSA key?

新问题使这个问题更具体、更切题。

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

可在此处找到来自 Microsoft 的 public 密钥:

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

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

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

supplied key param cannot be coerced into a public key

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

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

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

谢谢,

问题已解决。

原来 JSON 数组的 X5C 部分是证书而不是 public 密钥所以 JSON 解码 https://login.windows.net/common/discovery/keys 并获取 X5C 元素并使用 openssl导出 public 关键作品:

$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,导航到详细信息选项卡并单击 "copy to file",这将打开证书导出向导。

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

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

有效!可能有更简单的方法,但这个方法有效。