在 javascript 中创建可供 PHP 读取的 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 中创建了 pubkey

-----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);

也许还有其他 non-CLI 将 PKCS1 密钥转换为 PKCS8 的解决方案,但如果是的话我不知道。