将OpenSSL签名传递给PHP脚本



由于某些平台限制,我被迫在命令行中生成openSSL签名。我正在执行OpenSL符号命令,并使用OpenSSL验证命令进行验证。但是,当我疲倦地通过命令签名并通过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));

我相信签名传递是错误的,因为OpenSL命令会生成二进制内容,而当我将其传递给脚本时,它会破裂。有什么想法吗?

您可以base64编码openssl签名以进行文本式比较和传输。

您可以可能

$command = 'echo -n "'.$data.'" | openssl dgst -sha256 -sign '. $prvKey. ' | base64';

在PHP中。我还使用PHP的OPENSL命令和关键资源遇到了麻烦。它似乎更可靠:

file_get_contents($keypath);

和feed openssl功能包含键的字符串。我没有使用密码受保护的键尝试过此操作。如果使用关键资源不起作用,请尝试此尝试。BASE64如果不消化编码的字符串版本,则将其馈送到OpenSSL函数的签名解码。

我的答案是基于使用PHP的OPENSL功能来验证OpenSSL生成的签名的经验。我并没有尝试使用您正在做的事情,但是我有一个预感的问题可以通过战略性的基本64编码/解码来解决您的问题。实际上应该花一分钟的时间为您尝试。

最新更新