openssl_pkey_new

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

openssl_pkey_new生成新的私钥

描述

openssl_pkey_new(?array $options = null): OpenSSLAsymmetricKey|false

openssl_pkey_new() 生成新的私钥。以下示例展示了如何获取密钥的公钥部分。

注意: 你需要安装有效的 openssl.cnf 才能使此函数正常工作。有关更多信息,请参阅 安装部分 中的说明。

参数

options

你可以使用 options 微调密钥生成(例如指定位数)。有关 options 的更多信息,请参阅 openssl_csr_new()

返回值

如果成功,则返回一个 OpenSSLAsymmetricKey 实例,表示 pkey;如果失败,则返回 false

变更日志

版本 描述
8.0.0 如果成功,此函数现在返回一个 OpenSSLAsymmetricKey 实例;以前返回类型为 OpenSSL key资源
7.1.0 添加了 curve_name 选项,以便能够创建 EC 密钥。

示例

示例 #1 从私钥获取公钥

<?php
$private_key
= openssl_pkey_new();
$public_key_pem = openssl_pkey_get_details($private_key)['key'];
echo
$public_key_pem;
$public_key = openssl_pkey_get_public($public_key_pem);
var_dump($public_key);
?>

以上示例将输出类似于以下内容

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArZFsmN2P6rx1Xt7YV95o
gcdlal0k3ryiIhFNzjwtRNNTXfEfBr6lUuaIJYQ8/XqEBX0hpcfuuF6tTRlonA3t
WLME0QFD93YVsAaXcy76YqjjqcRRodIBphAbYyyMI/lXkQAdn7kbAmr7neSOsMYJ
El9Wo4Hl4oG6e52ZnYHyqW9dxh4hX93eupR2TmcCdVf+r9xoHewP0KJYSHt7vDUX
AQlWYcQiWHIadFsmL0orr6mutlXFReoHbesgKY9/3YLOu0JfxflSjIZ2JeL1NTl1
MsmODsUwgAUrwnWKKx+eQUP5g3GnSB3dPkRh9zRVRiLNWbCugyjrf3e6DgQWrW7j
pwIDAQAB
-----END PUBLIC KEY-----
resource(5) of type (OpenSSL key)
添加说明

用户贡献说明 10 条说明

50
dirt at awoms dot com
11 年前
工作示例

$config = array(
"digest_alg" => "sha512",
"private_key_bits" => 4096,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);

// 创建私钥和公钥
$res = openssl_pkey_new($config);

// 将私钥从 $res 提取到 $privKey
openssl_pkey_export($res, $privKey);

// 将公钥从 $res 提取到 $pubKey
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];

$data = 'plaintext data goes here';

// 使用公钥将数据加密到 $encrypted
openssl_public_encrypt($data, $encrypted, $pubKey);

// 使用私钥解密数据,并将结果存储在 $decrypted 中
openssl_private_decrypt($encrypted, $decrypted, $privKey);

echo $decrypted;
17
gomez dot alejandre at gmail dot com
5 年前
不要忘记 Windows 用户的 $configArgs :D,否则方法会抛出主密钥错误

// 写入你的配置 :D
$configargs = array(
"config" => "C:/xampp/php/extras/openssl/openssl.cnf",
'private_key_bits'=> 2048,
'default_md' => "sha256",
);

// 创建密钥对
$res=openssl_pkey_new($configargs);
// 获取私钥
openssl_pkey_export($res, $privKey,NULL,$configargs);

它适用于所有方法 ._ .

这里有一个完整的实现示例。

https://gist.github.com/DuckHunter213/269a0efd17e709f7f1f177ae7da46ad1

这个错误困扰了我整整 3 天,不谢 :)
13
scott at brynen dot com
9 年前
如果你尝试使用 openssl_pkey_new() 生成新密钥,并且需要指定密钥的大小,则密钥必须绑定到整数类型

// 可行
$keysize = 1024;
$ssl = openssl_pkey_new (array('private_key_bits' => $keysize));

// 失败
$keysize = "1024";
$ssl = openssl_pkey_new (array('private_key_bits' => $keysize));

// 可行(强制转换为整数)
$keysize = "1024";
$ssl = openssl_pkey_new (array('private_key_bits' => (int)$keysize));
5
Brad
16 年前
如果你只需要密钥,那么这比所有这些都容易

<?php
// 创建密钥对
$res=openssl_pkey_new();

// 获取私钥
openssl_pkey_export($res, $privkey);

// 获取公钥
$pubkey=openssl_pkey_get_details($res);
$pubkey=$pubkey["key"];
?>
0
Andrew
2 年前
这里没有记录,但你也可以从现有的密钥参数(例如来自 JWK)创建 ECC 密钥

<?php
$key
= openssl_pkey_new([
'ec' => [
'curve_name' => 'prime256v1',
'x' => $someXValue,
'y' => $someYValue,
'd' => $someDValue
]
]);
?>

如果它是公钥,你可以只提供 x/y;如果它是私钥,你可以只提供 d。
0
Jan
5 年前
如果此函数返回 false,请检查你的 openssl.cnf,并确保此文件中的 [req] 部分中的 default_bits 条目没有被注释掉。
-1
dodginess at yahoo dot com
7 年前
如果你将 openssl_pkey_new() 与 openssl_csr_new() 结合使用,并且想要更改 CSR 摘要算法并指定自定义密钥大小,则配置覆盖应该定义一次并发送给这两个函数

<?php
$config
= array(
'digest_alg' => 'sha1',
'private_key_bits' => 2048,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
);

$privkey = openssl_pkey_new($config);

$csr = openssl_csr_new($dn, $privkey, $config);
?>

虽然 openssl_pkey_new() 会接受 'digest_alg' 参数,但它不会使用它,并且设置该值不会产生任何效果,除非你同时为 openssl_csr_new() 设置此值。这是因为 $config 数组充当 openssl.cnf 文件中找到的值的替代品,因此它必须包含你需要的全部覆盖值,即使发送给它们的函数不会使用它们。

此外,如果你将 'digest_alg' 更改为类似 'sha256' 的内容,但仍然得到 MD5 签名的 CSR,请检查你的 openssl.cnf 文件,看看你想要使用的摘要算法是否实际上受支持。
-8
NOSPAM dot alchaemist at hiperlinux dot com dot ar
20 年前
正如你可能发现的,使用此文档获取公钥不像你想象的那么直接。

你可以轻松地进入这样的消息

警告:openssl_pkey_get_public(): 不知道如何从这个私钥获取公钥(文档有误)位于 D:\www\keys.php 第 4 行

获取整个过程的正确步骤似乎是这些

<?
$dn = array("countryName" => 'XX', "stateOrProvinceName" => 'State', "localityName" => 'SomewhereCity', "organizationName" => 'MySelf', "organizationalUnitName" => 'Whatever', "commonName" => 'mySelf', "emailAddress" => '[email protected]');
$privkeypass = '1234';
$numberofdays = 365;

$privkey = openssl_pkey_new();
$csr = openssl_csr_new($dn, $privkey);
$sscert = openssl_csr_sign($csr, null, $privkey, $numberofdays);
openssl_x509_export($sscert, $publickey);
openssl_pkey_export($privkey, $privatekey, $privkeypass);
openssl_csr_export($csr, $csrStr);

echo $privatekey; // 将保存导出的私钥
echo $publickey; // 将保存导出的公钥
echo $csrStr; // 将保存导出的证书
?>

现在你需要做的就是对每个单独的函数进行一些研究。
-23
zelnaga at gmail dot com
12 年前
通过 OpenSSL 提供的方法,获取与特定私钥相对应的公钥有点麻烦。更简单的方法是使用 phpseclib,一个纯 PHP RSA 实现

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->loadKey('...');

$privatekey = $rsa->getPrivateKey();
$publickey = $rsa->getPublicKey();
?>

不需要安装任何扩展。它将使用 bcmath 或 gmp(如果可用)来提高速度,但即使没有它们也不需要。
-12
jthijssen at notloxic dot nl
13 年前
如果你想将默认的私钥大小(1024)更改为其他大小,可以使用以下代码

<?php
$config
= array('private_key_bits' => 512);
$privKey = openssl_pkey_new($config);

?>

请注意,最小位数是 384。任何低于此的数字都会触发错误。
To Top