如何为php-jwt生成密钥对?

问题描述 投票:3回答:1

我试图使用PHP-JWT生成JWT,但我总是得到错误:

PHP Warning:  openssl_sign(): supplied key param cannot be coerced into a private key

我已经尝试使用openssl生成密钥对,使用opennssl用密码保护密钥,然后使用openssl_get_privatekey()读取它,我尝试在php(EOTEOD分隔符)的多行字符串中粘贴密钥。然后我尝试复制/粘贴示例页面上的键仍然得到相同的错误,我在这里缺少什么?

不知道这可能是一个问题,但我正在开发一台Windows机器,然后将其发送到远程服务器,这是一台Linux机器......

编辑:我如何生成密钥:

openssl genrsa -aes256 -out private.pem 2048

阅读:

openssl_get_privatekey('keys/private.pem','0mrY2mX9NeAb0RmpcoeF');
openssl_get_privatekey('file://'.__DIR__.'/keys/private.pem','0mrY2mX9NeAb0RmpcoeF');

还尝试过:openssl genrsa -out private.pem 2048阅读:

file_get_contents('keys/private.pem');

也尝试了在线:

$private_key = <<<EOT
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCt2WlpqowIDCZj+KCAl6iNEHCZN4FCPF3YrWdhthS2ysjNIjmy
1WjrzWpIk2YhkHmpb/+vFc5Xwv+a4NuB9W+hUw5K6bkgnol2Zak4v0myHR0qZsQP
ot7vj1Od+rU/Nn29rnDkgowcNcnN5MqxPrDOayA1IysXo1hPg73Hq2o40QIDAQAB
AoGAfhfI2zk148hcN/pm/54ARIB+CsM1X4NFVhk/eKGGGKawSgje7JTZSt5sjkNK
umF9vKVdP/KC/SiUGBOrYnFQCvH7CYpG74XQmnKf7JhhTF8t+N6b9SKz7oRsLHXJ
YwDntLTJIMfnFSQe9M9LJTcUUmTkIvDqq4T6L6OfSIQ/UVkCQQDg0xv60l6ELEdQ
J27dTxfs/kG6C1yjkoFU1UnBa6VVF/4PDOaPY7HvGxjZW+i3tj59i01W/OHOwswA
2uGExZ2bAkEAxfTDeOZh3mOaJ34x+W2wXQYwSh37hveiAQDvr21g/vixHHIPwomI
pP6wfLFK/4ApJHKOkB9Ha/bvrVSvhZIgAwJAMNHGtp1txreyuJYHfekJ4f2IGjUT
ZbWPffNes7CDU0oFchE0E5jrb2dr6u8JRrM9OJfCMIxzICmukNT2uZUL1wJBAKd0
cTLBuIKWwR2ta/ry5iEbDhh0moTG0D2HHDrLDSVDHRfSCTDohTYF2SfyFl5ifOs/
GQgj3ZggEQoQPFaCkR8CQQCVVyEBlUum82VDgpV+fBTYxzQo+bs7eWWPn93ebThv
4BVEwAHe7T6mjXwtu5U1iOB5h837aUp9Gc3mWprs/HUr
-----END RSA PRIVATE KEY-----
EOT;

但我认为问题不在于我如何生成密钥,因为README上的示例对我不起作用

php jwt
1个回答
3
投票

好像你忘了从私钥生成(或提取)公钥。

请确保您已完成以下步骤:

1)生成私钥:

openssl genrsa -out private.pem 2048

2)从私钥中提取公钥:

openssl rsa -in private.pem -outform PEM -pubout -out public.pem

3)和示例php代码:

<?php
require_once('vendor/autoload.php');

use \Firebase\JWT\JWT;

$privateKey = file_get_contents('./private.pem');

$publicKey = file_get_contents('./public.pem');

$payload = [
  'data' => ['field1' => 1, 'field2' => 'string data'],
  "iss" => "http://example.org",
  "aud" => "http://example.com",
  "iat" => 1531498466,
  "eat" => 1557000000
];

$token = JWT::encode($payload, $privateKey, 'RS256');
echo "Token:\n" . print_r($token, true) . "\n";


$decoded = JWT::decode($token, $publicKey, ['RS256']);
$decoded_array = (array) $decoded;

echo "Decoded:\n" . print_r($decoded_array, true) . "\n";

额外奖励:HS256示例

由于HS256是对称算法,因此不需要私钥/公钥对。

你可以使用你自己的blablabla式随机秘密字符串,而不使用生成器等:

<?php
require_once('vendor/autoload.php');

use \Firebase\JWT\JWT;

$secret = 'blablabla-secret-string'; 
// or You can save that random text in .jwt-secret  file and use this way
// $secret = file_get_contents('./.jwt-secret');

$payload = [
  'data' => ['field1' => 1, 'field2' => 'string data'],
  "iss" => "http://example.org",
  "aud" => "http://example.com",
  "iat" => 1531498466,
  "eat" => 1557000000
];

$token = JWT::encode($payload, $secret, 'HS256');
echo "HS256 Token:\n" . print_r($token, true) . "\n";


$decoded = JWT::decode($token, $secret, ['HS256']);
$decoded_array = (array) $decoded;

echo "HS256 Token decoded:\n" . print_r($decoded_array, true) . "\n";
© www.soinside.com 2019 - 2024. All rights reserved.