使用DER格式的密钥在PHP上签名文档


Using DER formated Keys to sign documents on PHP

我需要在PHP上签署PDF文档,我使用TCPDF库来做它

问题是我的。CER和my 。密钥文件为DER格式,openssl_pkcs7_sign()函数可以加载私钥,如果是这种格式

如果我在我的终端上使用openssl命令将我的密钥从二进制DER格式转换为ASCII一切都工作,但我不想使用exec函数通过PHP调用系统函数。

稍作研究后,我发现了这个问题:用PHP将.key文件从DER格式加载到PEM格式其中一个答案建议打开文件,获取内容并使用转换。

function der2pem($der_data, $type='CERTIFICATE') {
    $pem = chunk_split(base64_encode($der_data), 64, "'n");
    $pem = "-----BEGIN ".$type."-----'n".$pem."-----END ".$type."-----'n";
    return $pem;
}

但是当我使用此函数转换我的数据时,结果与控制台上的openssl生成的文件不同,而函数openssl_pkcs7_sign()再次抛出错误


这是我转换文件的PHP代码:

<?php
$myKey = 'p-key.key';
$private_key = file_get_contents($myKey);
echo der2pem($private_key,'PRIVATE KEY');
file_put_contents('p-key.key.pem', der2pem($private_key,'PRIVATE KEY'));
function der2pem($der_data, $type = 'CERTIFICATE')
{
     $pem = chunk_split(base64_encode($der_data), 64, "'n");
     $pem = "-----BEGIN ".$type."-----'n".$pem."-----END ".$type."-----'n";
     return $pem;
}
这是我的openssl命令:
openssl pkcs8 -in p-key.key -out p-key.key.pem -inform DER -outform PEM


对此有什么解释吗?
正确的做法是什么?
我应该使用执行来解决我的问题吗?

提前感谢
如果您需要更多信息请告诉我

不用看你在做什么,我可以告诉你,你在那里的函数是有效的。这很可能取决于一些事情,为什么它不适合你,没有更多的信息,这将很难判断。

默认情况下,该函数会将您的数据转换为base64并添加"BEGIN CERTIFICATE"页眉和页脚-请注意,如果您调用该函数来处理私钥,则需要像这样调用它:

$keyVal = der2pem($YOUR_KEY_DATA, 'PRIVATE KEY');