【问题标题】:OpenSSL won't create private keys?OpenSSL 不会创建私钥?
【发布时间】:2013-05-27 20:21:17
【问题描述】:

好的,这是我第一次在项目中使用加密。我正在使用我的托管服务提供商进行 SSL,但我也想加密数据库中敏感的部分。为此,我被告知使用 OpenSSL。我正在我的 localhost (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_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钥匙”

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

提前致谢, Elie Zeitouni

【问题讨论】:

  • 你检查过函数的返回值吗?
  • 我最近在将项目更新到 PHP 7.3 时遇到了这个问题,结果证明是密钥大小太小 - 小于 512 位不起作用,这导致一些测试用例使用较小的值会失败并显示此消息。

标签: php encryption openssl key private


【解决方案1】:

我认为phpseclib, a pure PHP RSA implementation 可能会让您过得更轻松。以下示例将创建一个 1024 位 RSA 私钥/公钥:

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

$rsa = new Crypt_RSA();

extract($rsa->createKey());

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

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。

    这是Windows的问题!!!

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

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

    OpenSSL not working on Windows, errors 0x02001003 0x2006D080 0x0E064002

    【讨论】:

      【解决方案3】:

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

      因此,如果您查看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。

      希望对您有所帮助。 :)

      【讨论】:

        【解决方案4】:

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

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

        希望这对某人有所帮助。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            这适用于 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;
            

            【讨论】:

              猜你喜欢
              • 2017-11-12
              • 2019-06-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-07-19
              • 1970-01-01
              相关资源
              最近更新 更多