我需要在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');