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

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

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

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

使用此文件中的密钥将对用户在表单中键入的数据进行签名,generate/download 一个包含签名的 xml 文件。

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

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

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

我知道我可以使用一个函数轻松地将 DER 格式转换为 PEM(我已经使用 public 密钥对文件进行了转换)但问题在于在它。

出于安全原因,我无法调用 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);

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