从使用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时,您必须在页眉和页脚中添加文本";"加密";否则就行不通了。如果私钥没有被加密/保护;"加密";页眉和页脚中的文本。