由于某些平台限制,我不得不在命令行中生成openssl签名。我正在执行openssl sign命令,并使用openssl verify命令对其进行验证。但是当我厌倦了通过命令签名并通过php验证时,它就会失败。
$filesize = filesize('test.txt');
$fp = fopen('test.txt', 'rb');
$data = fread($fp, $filesize);
$prvKey = 'qa_sig_ec.key';
$command = 'echo -n "'.$data.'" | openssl dgst -sha256 -sign '. $prvKey;
$sig = exec($command);
$filesize2 = filesize(__DIR__."\qa_sig_ec.pub");
$fp2 = fopen(__DIR__."\qa_sig_ec.pub", 'rb');
$publicKey = fread($fp2, $filesize2);
var_dump(openssl_verify($data, $sig, $publicKey, OPENSSL_ALGO_SHA256));
我认为签名传递有问题,因为openssl命令会生成二进制内容,而当我将其传递给脚本时会出现perhpas,它会中断。 有什么想法吗?
答案 0 :(得分:0)
您可以base64编码openssl签名,以进行文本比较和传输。
您可以大概:
$command = 'echo -n "'.$data.'" | openssl dgst -sha256 -sign '. $prvKey. ' | base64';
在php中。我也很难在关键资源中使用php的openssl命令。似乎更可靠:
file_get_contents($keypath);
然后feed openssl函数将包含键的字符串用作函数。我没有用密码保护密钥尝试过此操作。如果无法使用关键资源,请尝试此操作。如果未消化编码的字符串版本,base64会对签名进行解码以将其以二进制形式提供给openssl函数。
我的答案是基于使用php的openssl函数来验证openssl生成的签名的经验。我没有尝试准确地做您正在做的事,但是我有预感,可以通过战略性的base64编码/解码来解决您的问题。实际需要一分钟的时间才能尝试完成。