如何为 php-jwt 生成密钥对?
Posted
技术标签:
【中文标题】如何为 php-jwt 生成密钥对?【英文标题】:How to generate key pair for php-jwt? 【发布时间】:2018-12-21 23:31:26 【问题描述】:我正在尝试使用php-JWT 生成 JWT,但我总是最终得到错误:
PHP Warning: openssl_sign(): supplied key param cannot be coerced into a private key
我已经尝试使用 openssl 生成密钥对,使用 opennssl 使用密码保护密钥,然后使用 openssl_get_privatekey()
读取它,我尝试将密钥粘贴到 php 中的多行字符串中(EOT
和 @ 987654325@ 分隔符)。然后我尝试在示例页面上复制/粘贴密钥,但仍然出现相同的错误,我在这里遗漏了什么?
不知道这会不会是个问题,但是我在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 中的示例对我不起作用
【问题讨论】:
请添加您的代码以查看您如何尝试生成它们。 编辑了问题,但我认为问题不在于我如何生成密钥,因为自述文件中的示例对我不起作用 【参考方案1】:好像你忘了从私钥生成(或提取)公钥。
请确保您已完成以下步骤:
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";
【讨论】:
@YuriWaki 很高兴这对您有所帮助 @TheRealChx101 RS256 是一种非对称算法,这意味着它使用公钥/私钥对。 HS256 是一种对称算法,意味着共享一个密钥,因此不需要密钥对。所以您可以同时使用 HS256 或 RS256。但是你必须决定你喜欢什么样的安全概念。为了实现的简单性,您可以使用 HS256,它甚至不需要密钥 RSA 密钥生成,您可以将任何您想要的作为秘密传递。更多信息谷歌它:google.com/search?q=jwt+rs256+vs+hs256&ie=utf-8 @TheRealChx101 我在 hs256 示例中添加了Bonus
部分。
谢谢。在等待您的回答时,我也在做研究,我确实发现 HMAC/RSA 是不同的。此外,您可能希望在出现未处理的异常/错误时警告用户,您的密钥可能会显示在堆栈跟踪中。
@num8er 是的。我明白你的意思,这正是我在我的项目中所做的。 但是,发生的事情是,错误处理程序显示键的实际内容或传递给有问题的函数的任何参数。所以,这是任何人都需要注意的事情。密钥存储在哪里无关紧要,一旦它进入内存,遇到异常或脚本错误,所有相关数据都将通过堆栈跟踪公开。 BTW,系统已经在提示我们去聊天了。所以这将是我的最后评论。以上是关于如何为 php-jwt 生成密钥对?的主要内容,如果未能解决你的问题,请参考以下文章
如何为 Google App Signing 生成上传密钥?
如何为 Identity Server 4 生成和添加签名密钥?