6

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

// 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_pkey_export_to_file(): cannot get key from parameter 1:”和“openssl_pkey_get_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 parameter is not a valid private key”

显然,我在创建私钥时遇到了问题。我已经彻底搜索了互联网并且无法修复它,即使我已经实现了似乎适用于其他所有人的简单代码。

提前致谢, Elie Zeitouni

4

6 回答 6

9

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

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

openssl_pkey_export($res, $privKey, NULL);

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

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

出于这个原因,正如您为 所做的那样,openssl_pkey_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。

希望能帮助到你。:)

于 2014-04-03T19:24:55.207 回答
4

用 xampp php 5.5 让它在 windows10 上工作让我头疼不已。最后发现上面的 tabone 的答案是正确的,除了需要正斜杠的路径格式!

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

希望这可以帮助某人。

于 2015-09-02T23:39:26.180 回答
3

我认为您可能会更轻松地使用phpseclib,这是一个纯 PHP RSA 实现。以下示例将创建一个 1024 位 RSA 私钥/公钥:

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

$rsa = new Crypt_RSA();

extract($rsa->createKey());

echo $privatekey . '<br/>' . $publickey;
?>
于 2013-06-05T15:41:11.153 回答
2

我有同样的问题。

这是Windows的问题!

它不会发生在 unix 基础系统上。

而且,如果像我一样,您仅将 Windows 用于开发,您可以使用 PuTTYGen 生成密钥,并在开发环境中静态使用它!

或者

OpenSSL 在 Windows 上不起作用,错误 0x02001003 0x2006D080 0x0E064002

于 2013-12-18T00:58:16.170 回答
1

使用:openssl_pkey_export_to_file($result, 'privkey.pem', null, $config);

于 2016-09-14T22:16:24.593 回答
0

这适用于 wampp/php 7.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;
于 2019-05-28T19:19:41.613 回答