之前写了一篇【使用 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 的环境可参考以下资料:
转载请注明:隨習筆記 » PHP 笔记:利用 OpenSSL 扩展创建 RSA 私钥和公钥