这是一个新问题,我试图找到解决方案,但没有成功。
这是我的必需品。用户将填写包含大量数据的表单,并以相同的形式上传2个文件,并为其中一个文件键入密码。
一个文件的DER格式(PKCS8)私钥受保护 密码(用户将键入的密码)。
另一个文件没有DER格式的公钥(PKCS8) 密码
使用此文件中的密钥,将对用户在表单中键入的数据进行签名,并生成/下载带有符号的xml文件。
我知道使用 openssl 这需要采用PEM格式,并使用命令
“openssl pkcs8 -inform DER private.key -out private.key.pem -passin pass:password”
我可以将文件转换为这种格式。但我有一个限制:
我知道我可以使用一个函数轻松地将DER格式转换为PEM(我已经使用公钥对文件进行了处理)但问题在于其中包含密码的私钥。
出于安全原因,我无法调用exec函数来执行此操作,并且我不希望以相同的原因将文件存储为pem格式。
有没有办法(php库,代码等)我可以在不使用openssl的情况下提取私钥文件的内容,也不保存新文件?我正在尝试使用其他库,如Crypt_RSA,但我还没有找到一个如何使用该库执行该操作的示例。
任何帮助将不胜感激。
答案 0 :(得分:0)
这么多年后,我发现自己又遇到了这个问题,但现在我有了答案,而且很简单:
$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”文本。