繁体   English   中英

从使用 PHP 密码保护的 DER 格式 (PKCS8) 文件中获取私钥

[英]Get private key from a file with DER format (PKCS8) protected with passwordin PHP

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

这是我的需要。 用户将用一堆数据填写一个表单,并在同一个表单中上传 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,但我还没有找到如何使用该库执行该操作的示例。

任何帮助将不胜感激。

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

$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”文本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM