2016-01-19 71 views
1

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

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

我真的被卡住了 - 我认为它应该是相当普遍的,但经过一整天的搜索,我无法理解一件事。很多标准,格式...

任何人都可以建议一个图书馆或方法,我可以在cient创建密钥在JS和验证邮件,使用pubkey在PHP

这是我到目前为止有: 我创建了一个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"));

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

+0

问题要求我们推荐或找到书籍,工具,软件库,教程或其他非本地资源,因为它们倾向于吸引自以为是的答案和垃圾邮件,所以不适合堆栈溢出。相反,请描述问题以及到目前为止解决问题所做的工作。 – Epodax

+0

它可能不是那么常见的一个需求,因为它似乎试图重复SSL/TLS已经做的事情 –

+0

嗯,当_server_创建密钥时,这真的很常见。 在我的情况下,客户端应该创建密钥并向公众提供服务器,所以我们没有客户端的秘密 - 我们可以验证他的消息。它在现实生活中也很常见,但麻烦在于我们必须通过js在浏览器中创建密钥。 –

回答

0

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但如果是这样,我不知道这一点。