【问题标题】:Get private key from a file with DER format (PKCS8) protected with passwordin PHP从 PHP 中受密码保护的 DER 格式 (PKCS8) 文件中获取私钥
【发布时间】:2016-03-01 04:27:45
【问题描述】:

这是一个新问题,我试图找到解决方案但没有成功。

这是我的必需品。用户将用一堆数据填写表格,并在同一个表格中上传 2 个文件,并为其中一个文件输入密码。

  • 一个文件的私钥采用 DER 格式 (PKCS8) 受保护 密码(用户输入的密码)。

  • 另一个文件具有 DER 格式 (PKCS8) 的公钥,但没有 密码。

使用此文件中的密钥 a 将对用户在表单中键入的数据进行签名,并生成/下载带有签名的 xml 文件。

我知道使用 openssl 这需要采用 PEM 格式,并使用命令

“openssl pkcs8 -inform DER private.key -out private.key.pem -passin pass:password”

我可以将文件转换为这种格式。但我有一个限制:

我知道我可以使用函数轻松地将 DER 格式转换为 PEM(我已经使用带有公钥的文件做到了这一点),但问题在于其中包含密码的私钥。

出于安全原因,我无法调用 exec 函数来执行此操作,并且出于同样的原因我不想以 pem 格式存储文件。

有没有一种方法(php 库、代码等)可以在不使用 openssl 或保存新文件的情况下提取私钥文件的内容?我正在尝试使用其他库,例如 Crypt_RSA,但我还没有找到如何使用该库执行此操作的示例。

任何帮助将不胜感激。

【问题讨论】:

  • 你解决了这个问题吗?
  • @J261 是的...:p

标签: php password-protection encryption-asymmetric


【解决方案1】:

这么多年后,我再次发现自己遇到了这个问题,但现在我有了答案并且很容易:

$path_key = 'C:/Private.key';
$key_content = file_get_contents($path_key);
$pem_from_key = '-----BEGIN ENCRYPTED PRIVATE KEY-----' . PHP_EOL
        . chunk_split(base64_encode($key_content), 64, PHP_EOL)
        . '-----END ENCRYPTED PRIVATE KEY-----' . PHP_EOL;
$private_key = openssl_pkey_get_private($pem_from_key, 'password');
openssl_private_encrypt($data_to_encrypt, $encrypted_data, $private_key);

私钥使用密码进行加密/保护,因此,当您从 der 转换为 pem 时,您必须在页眉和页脚中添加文本“ENCRYPTED”,否则它将不起作用。如果私钥未加密/保护,您必须删除页眉和页脚中的“ENCRYPTED”文本。

【讨论】:

    猜你喜欢
    • 2018-06-28
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2012-08-31
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    相关资源
    最近更新 更多