在 PHP 可读的 JavaScript 中创建 PEM 密钥对


Create PEM keypair in javascript readable by PHP

用例:客户端在浏览器中创建RSA密钥对,将公钥发送到服务器,然后使用保存在本地存储中的密钥对消息进行签名。

我已经查看了 JWT,但它在浏览器中没有密钥对生成(或者我找不到它)。我找到了一个创建密钥 (https://github.com/juliangruber/keypair) 的库,但我从 openssl_pkey_get_public 函数中获得了一个在 PHP 中不可读的 pub 密钥。

我真的很困 - 我认为这应该是很常见的,但经过一整天的谷歌搜索,我什么都听不懂。很多标准,格式...

任何人都可以建议一个库或方法,通过它我可以在 JS 中创建密钥并使用 PHP 中的 pubkey 验证消息

这是我到目前为止所拥有的:我已经在JS中使用上面提到的库创建了公钥

-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAM3CosR73CBNcJsLv5E90NsFt6qN1uziQ484gbOoule8leXHFbyIzPQRozgEpSpi
whr6d2/c0CfZHEJ3m5tV0klxfjfM7oqjRMURnH/rmBjcETQ7qzIISZQ/iptJ3p7Gi78X5ZMh
LNtDkUFU9WaGdiEb+SnC39wjErmJSfmGb7i1AgMBAAE=
-----END RSA PUBLIC KEY-----

然后我把它保存到"/pubKey.pem"文件,并尝试用PHP读取它: openssl_pkey_get_public(file_get_contents("/pubKey.pem"));

它失败了。我想格式不是预期的格式吗?

openssl_pkey_get_public期望密钥采用PKCS8格式。

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNwqLEe9wgTXCbC7+RPdDbBbeq
jdbs4kOPOIGzqLpXvJXlxxW8iMz0EaM4BKUqYsIa+ndv3NAn2RxCd5ubVdJJcX43
zO6Ko0TFEZx/65gY3BE0O6syCEmUP4qbSd6exou/F+WTISzbQ5FBVPVmhnYhG/kp
wt/cIxK5iUn5hm+4tQIDAQAB
-----END PUBLIC KEY-----

我能够用phpseclib转换它:

<?php
include('Crypt/RSA.php');
$key = '-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAM3CosR73CBNcJsLv5E90NsFt6qN1uziQ484gbOoule8leXHFbyIzPQRozgEpSpi
whr6d2/c0CfZHEJ3m5tV0klxfjfM7oqjRMURnH/rmBjcETQ7qzIISZQ/iptJ3p7Gi78X5ZMh
LNtDkUFU9WaGdiEb+SnC39wjErmJSfmGb7i1AgMBAAE=
-----END RSA PUBLIC KEY-----';
$rsa = new Crypt_RSA();
$rsa->loadKey($key);
$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS8);
$res = openssl_pkey_get_public("$rsa");
var_dump($res);

也许还有其他非 CLI 解决方案可以将 PKCS1 密钥转换为 PKCS8,但如果是这样,我不知道。