Php OpenSSL赢得';你不能创建私钥吗?

Php OpenSSL赢得';你不能创建私钥吗?,php,encryption,openssl,key,private,Php,Encryption,Openssl,Key,Private,好吧,这是我第一次在项目中使用加密技术。我正在使用我的SSL托管提供商,但我还想加密数据库中敏感的部分。为此,我被告知使用OpenSSL。我正在本地主机(WAMP)上测试它,已经安装了OpenSSL并打开了PHP和Apache SSL mods。好的,我一直在学习教程,并且使用了几种建议的方法,已经能够生成公钥并将其存储为文件。由于某种原因,我似乎无法生成私钥。我将发布我尝试过的两个版本的代码: // generate private key $privateKey = openssl_pkey

好吧,这是我第一次在项目中使用加密技术。我正在使用我的SSL托管提供商,但我还想加密数据库中敏感的部分。为此,我被告知使用OpenSSL。我正在本地主机(WAMP)上测试它,已经安装了OpenSSL并打开了PHP和Apache SSL mods。好的,我一直在学习教程,并且使用了几种建议的方法,已经能够生成公钥并将其存储为文件。由于某种原因,我似乎无法生成私钥。我将发布我尝试过的两个版本的代码:

// generate private key
$privateKey = openssl_pkey_new(array(
    'private_key_bits' => 1024,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
));
// write private key to file
openssl_pkey_export_to_file($privateKey, 'private.key');
// generate public key from private key
$publicKey = openssl_pkey_get_details($privateKey);
// write public key to file
file_put_contents('public.key', $publicKey['key']);
// clear key
echo $privateKey;

?>
这将生成一个public.key文件,但为我提供了警告“openssl\u pkey\u export\u to\u file():无法从参数1获取密钥:”和“openssl\u pkey\u get\u details()期望参数1为资源布尔值”

我还尝试了另一种方法:

$config = array(
    "config" => "E:/wamp/bin/apache/apache2.2.22/conf/openssl.cnf",
    "digest_alg" => "sha512",
    "private_key_bits" => 1024,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
);

// Create the private and public key
$res = openssl_pkey_new($config);

// Extract the private key from $res to $privKey
openssl_pkey_export($res, $privKey, NULL);
echo "Private Key: ".$privKey;
// Extract the public key from $res to $pubKey
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];
echo "Public Key: ".$pubKey;
$data = 'plaintext data goes here';
echo "Data: ".$data;
// Encrypt the data to $encrypted using the public key
openssl_public_encrypt($data, $encrypted, $pubKey);
echo "Encrypted: ".$encrypted;
// Decrypt the data using the private key and store the results in $decrypted
openssl_private_decrypt($encrypted, $decrypted, $privKey);

echo "Decrypted: ".$decrypted;
这应该会回显所有内容,不幸的是,我的结果是一个空白私钥、一个良好的公钥、明文和加密文本,并且在尝试解密时出错:“openssl_private_decrypt():key参数不是有效的私钥”

显然,我在创建私钥方面遇到了问题。我已经彻底搜索了互联网,但仍然无法修复它,尽管我实现了简单的代码,似乎对其他人都适用

提前感谢,,
Elie Zeitouni

我想你可能会更容易相处。以下示例将创建1024位RSA私钥/公钥:

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

$rsa = new Crypt_RSA();

extract($rsa->createKey());

echo $privatekey . '<br/>' . $publickey;
?>

我也有同样的问题

这是Windows问题的

这不会发生在基于unix的系统上

而且,如果你像我一样只使用Windows进行开发,那么你可以使用PuTTYGen生成一个密钥,并在开发环境中使用它,静态的


我知道这已经有一段时间了,你可能已经解决了,但我认为我的回答对其他面临同样问题的人(像我一样)会有帮助

因此,如果您查看文档,您会发现它需要四个不同的参数。如果我们看一下您的第二个实现,就会发现您只提供了三个

openssl_pkey_导出($res,$privKey,NULL)

如果只有您的服务器具有正确的OPENSSL_CONF环境变量,那么这将同样好。链接到OPENSSL.cnf文件,正如随XAMPP下载的README-SSL.txt文件中所引用的那样,需要从PHP使用CSR和密钥生成函数

要使用PHP中的CSR和密钥生成功能,需要安装一个openssl.cnf文件。我们在这个自述文件旁边的文件夹中包含了一个可用于此目的的示例文件

出于这个原因,就像您对
openssl\u pkey\u new($config)所做的那样必须创建包含config=>“/path/to/openssl.cnf”的关联数组。就这样,

openssl_pkey_export($res, $privKey, NULL, $config);
我还想补充一点,在我的案例中,openssl.cnf的路径在:

C:\xampp\php\extras\openssl\openssl.cnf

在这里,您还可以找到一个README-SSL.txt文件,该文件很好地解释了如何配置OPENSSL


希望有帮助。:)

用xampp PHP5.5在windows10上实现这一点让我头痛不已。最后,我发现塔伯恩的答案是正确的,除了路径格式需要向前斜杠

C:/xampp/php/extras/openssl/openssl.cnf

希望这对某人有所帮助。

使用:openssl\u pkey\u export\u to\u file($result,'privkey.pem',null,$config)

这适用于wampp/PHP7.0.4

$privateKey = openssl_pkey_new(array(
'config' => 'C:/wamp/bin/php/php7.0.4/extras/ssl/openssl.cnf',
'private_key_bits' => 1024,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
 ));

// write private key to file
openssl_pkey_export_to_file($privateKey, 'private.key');

// generate public key from private key
$publicKey = openssl_pkey_get_details($privateKey);

// write public key to file
file_put_contents('public.key', $publicKey['key']);

// clear key
echo $privateKey;

你检查过函数的返回值了吗?我最近在将一个项目更新到PHP7.3时遇到了这个问题,结果是密钥大小太小-小于512位是不起作用的,这导致一些使用较小值的测试用例失败。