每天学习一点点,成功增加一大步

PHP 笔记:利用 OpenSSL 扩展创建 RSA 私钥和公钥

PHP zhanghui 268℃

之前写了一篇【使用 JWT 创建 Token】,这里面就涉及到公钥和密钥的需求,那么这个需求如何方便去获得呢?因为私钥和公钥不是由随机字符简单的产生,带着这个疑问去研究。现将过程记录下来。

我从网上找了段参考的代码,因为我发现很多的资料是复制的,所以只能自己来试着运行看看,下面这段代码是从网上找来的

$config = array(
//"digest_alg" => "sha512",
//字节数 512 1024 2048 4096 等
"private_key_bits" => 512,
//加密类型
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);
//1.创建公钥和私钥
$res = openssl_pkey_new($config);
//从得到的资源中获取私钥
openssl_pkey_export($res, $privKey);
//从得到的资源中获取私钥
$pubKey = openssl_pkey_get_details($res);

可运行后产生了下面的错误

openssl_pkey_export(): cannot get key from parameter 1 in ……

经过代码逐步调试,发现

openssl_pkey_new($config);

返回的值是:bool(false)。

在网上搜索发现是 window 系统缺少了 openssl 环境变量,解决方法如下:

在代码中加上下面这段代码

$ConfigPath = "C:/php/5538/extras/ssl/openssl.cnf";

这是 IIS 作为 WEB 服务器时采取从 PHP 安装包处找这个文件

APACHE 参与:点这里

这下错误提示是没有了,但 $privateKey 返回的是 null。于是呼再找资料,发现错误点在

openssl_pkey_export($res, $privKey);

没有传入配置的信息。最后终于运行成功并拿到密钥和公钥,完整的代码:

$ConfigPath = "C:/php/5538/extras/ssl/openssl.cnf";
$config = array(
"digest_alg" => "sha256",
// "private_key_bits" => 2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);
//1.创建公钥和私钥
$res = openssl_pkey_new($config);
if (!$res) {
$config['config'] = $ConfigPath;
$res = openssl_pkey_new($config);
}
//从得到的资源中获取私钥
//并把私钥赋给$privKey
openssl_pkey_export($res, $privateKey, null, $config);
//从得到的资源中获取私钥 并把私钥赋给$pubKey
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];
var_dump(array('privateKey'=>$privateKey,'pubKey'=>$pubKey));
die();

运行结果:

array(2) {
["privateKey"]=>
string(916) "-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALFMy/yJfoQw5wNg
G4FGLLJXN6cPQXBP8eZFFWm99oQzRDFAzqFUP8M221eDOw1F9BPLvWad4wwsj4ry
v22xEnacZWNNT7ADMWpsJvNl8z03lyESWGo/5rkRoM7UZAgPqF88gqwGZDl/L6LH
Hf9oujTs4CZ5oxso9SsmdBU6PXqfAgMBAAECgYBeeoj84pvLf2+q6czeX3Gz+ywJ
1uRNIBzMUyXs+jBiFBuTj3BMoeN0eEf7409VbGB7KAeepiX2N8yqA18k6cXnEZGR
541dQSoIBw1Fpleo8yUr763wo4nBczYrfVc/OBJgm9Itdq7pWt/avKwPiGx6NHQQ
CH+vpHEJigHm9eYUuQJBANxxiBAb9COymPwTwYS9vaJOz9vhdNnoMcqrTjBKkCyN
LWXV4afiUV3RyV+mp2LvchPXhpwDWrWil9AGkpQIl9UCQQDN5czvwRowh++M7sAO
T4xrjK/5Xdl+z+g2/SK6M95MSTPjvyTONJ1W9wzlffvTEMTv/Zaw9j4E/q+6XCyV
lpajAkEAlhl33AAsrGHfaUTKb+gCR5ICVmWdewJvZOBfzOH4aV13m++WRwoC/S7r
PwXq06LWukv2jCR8j1C2rh7Lj6CKQQJBAMgdISGkvJ+OfvSq118RUZj2E9J5tHnb
+AX54Va4MsZSH2yqykrgOEvdsVsbJzXshnv6LAuySHTyVDj8fRimU6ECQGBIx5UZ
I2vDS7LkvVGSccZjlo3XmQuSWkX6CrxDSLbTl64lyzNIDoJonrq8ljVTgPii7TFP
ITRZIV78fAMtESU=
-----END PRIVATE KEY-----
"
["pubKey"]=>
string(272) "-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCxTMv8iX6EMOcDYBuBRiyyVzen
D0FwT/HmRRVpvfaEM0QxQM6hVD/DNttXgzsNRfQTy71mneMMLI+K8r9tsRJ2nGVj
TU+wAzFqbCbzZfM9N5chElhqP+a5EaDO1GQID6hfPIKsBmQ5fy+ixx3/aLo07OAm
eaMbKPUrJnQVOj16nwIDAQAB
-----END PUBLIC KEY-----
"
}

以上是实验环境是: windows + IIS + PHP 5.5。

Linux 的环境可参考以下资料:

https://blog.csdn.net/clh604/article/details/20224735

转载请注明:隨習筆記 » PHP 笔记:利用 OpenSSL 扩展创建 RSA 私钥和公钥