当前位置: 首页 > 知识库问答 >
问题:

在PHP中使用RSA公钥验证JWT签名

严知
2023-03-14

在PHP中,我试图使用AWS的RSA公钥(我在https://cognito-identity.amazonaws.com/.well-known/jwks_uri). 密钥以适当的页眉/页脚开始,然后开始RSA公钥等等。我查看了一些PHP库,如Emarref\Jwt\Jwt\code>,但是我发现了错误:错误:0906D06C:PEM例程:PEM\u read\u bio:no start line。这一切归结为基本的php函数:openssl\u verify

我已经研究了php。net/manual进行openssl验证,但我仍然不清楚参数的详细信息。所需的算法是RS512。

我能够使用node.js没有问题地验证JWT令牌(相同的密钥和令牌)。为此,我使用了库:https://github.com/auth0/node-jsonwebtoken

不知道为什么这在PHP中不起作用。我可以不使用RSA公钥吗?

function verifyKey($public_key) {
  $jwt = new Emarref\Jwt\Jwt();

  $algorithm = new Emarref\Jwt\Algorithm\Rs512();
  $factory = new Emarref\Jwt\Encryption\Factory();
  $encryption = $factory->create($algorithm);
  $encryption->setPublicKey($public_key);
  $context = new Emarref\Jwt\Verification\Context($encryption);
  $token = $jwt->deserialize($authToken);

  try {
    $jwt->verify($token, $context);
  } catch (Emarref\Jwt\Exception\VerificationException $e) {
    debug($e->getMessage());
  }
}

共有2个答案

夏学名
2023-03-14

我能让这座图书馆运转起来。但是,我必须使用KeyFactory::createFromValues而不是KeyFactory::createFromPEM构建键。谢谢您!

乐华晖
2023-03-14

能否尝试使用其他PHP库:https://github.com/Spomky-Labs/jose

// File test.php
require_once __DIR__.'/vendor/autoload.php';

use Jose\Checker\ExpirationChecker;
use Jose\Checker\IssuedAtChecker;
use Jose\Checker\NotBeforeChecker;
use Jose\Factory\KeyFactory;
use Jose\Factory\LoaderFactory;
use Jose\Factory\VerifierFactory;
use Jose\Object\JWKSet;
use Jose\Object\JWSInterface;

// We create a JWT loader.
$loader = LoaderFactory::createLoader();

// We load the input
$jwt = $loader->load($input);

if (!$jws instanceof JWSInterface) {
    die('Not a JWS');
}

// Please note that at this moment the signature and the claims are not verified

// To verify a JWS, we need a JWKSet that contains public keys (from RSA key in your case).
// We create our key object (JWK) using a RSA public key
$jwk = KeyFactory::createFromPEM('-----BEGIN RSA PUBLIC KEY-----...');

// Then we set this key in a keyset (JWKSet object)
// Be careful, the JWKSet object is immutable. When you add a key, you get a new JWKSet object.
$jwkset = new JWKSet();
$jwkset = $jwkset->addKey($jwk);


// We create our verifier object with a list of authorized signature algorithms (only 'RS512' in this example)
// We add some checkers. These checkers will verify claims or headers.
$verifier = VerifierFactory::createVerifier(
    ['RS512'],
    [
        new IssuedAtChecker(),
        new NotBeforeChecker(),
        new ExpirationChecker(),
    ]
);

$is_valid = $verifier->verify($jws, $jwkset);

// The variable $is_valid contains a boolean that indicates the signature is valid or not.
// If a claim is not verified (e.g. the JWT expired), an exception is thrown.

//Now you can use the $jws object to retreive all claims or header key/value pairs
 类似资料:
  • 我想知道是否有一个示例C代码或库可以使用RSA公钥验证我的JWT令牌签名。我找不到任何涉及C的示例 openssl for C没有任何与RSA相关的示例。 谢谢

  • 我想验证一些来自Microsoft的JWT的签名。我正在使用Spring-Boot、JJWT库和以下endpoint:https://login.microsoftonline.com/common/discovery/v2.0/keys endpoint返回JSON公钥数组。下面是数组中的一个示例。

  • 问题内容: 我有一个外部服务,在定义的事件发生后会给我回电,并用其私钥签署他的请求。 我已经存储了如下公钥: 因此,我的工作是通过验证签名来检查请求的内容是否未更改。 这是我的算法: 但是目前,我的算法已停止在此消息的“ PublicKey publicKey = keyFactory.generatePublic(publicKeySpec)”步骤处: 那么,如何以java api接受的方式加载

  • 我想知道在spring boot security中使用公钥和私钥创建和验证JWT签名的过程。 我试图使用HMAC算法验证JWT令牌。我正在用硬编码的秘密“秘密”构建JWT。 解析代码的步骤如下 我想使用公钥和私钥,而不是使用签名密钥作为“秘密”

  • 验证应用程序: 据我所知.pfx文件包含公钥和私钥信息,因此我不应该让任何人都可以使用它。据我所知,验证步骤只需要公钥。我如何使用rsa.verifydata或其他函数来验证签名而不暴露我的pfx文件?

  • 我正在使用这个库node jwks rsa从auth0 jwks获取JWT密钥。json文件,以验证我的应用程序在身份验证后检索的id_令牌实际上来自我的身份验证提供程序。 在引擎盖下,它使用此方法构建公钥PEM (使用x50c作为. jwks文件中的参数)。 然后,我将其与jsonwebToken结合使用,以验证JWT(id_token)是否有效。 这种验证方法与根据jwks的模和指数生成私钥(