当尝试使用Laravel/PHP从SendGrid转换公钥时,验证库(ECDSA)出现问题

tcbh2hod  于 2023-04-28  发布在  PHP
关注(0)|答案(1)|浏览(176)

我正在做一个项目,我试图处理从SendGrid打开和点击事件。我在他们的instructions之后设置了一个webhook,并成功地接收了数据推送。当绕过签名验证时,我可以存储数据。
我正在使用签名的事件请求,可以看到签名和时间戳的头:

"X-Twilio-Email-Event-Webhook-Signature"
"X-Twilio-Email-Event-Webhook-Timestamp"

我正在尝试将SendGrid提供给我的公钥转换为ECDSA字符串,这样我就可以比较它并验证头中的签名。
为此,我安装了ECDSA library。当发送公钥到转换函数时,我得到以下错误:

gmp_init(): Argument #1 ($num) is not an integer string

我也试过使用SendGrid PHP library,但是,它使用相同的ECDSA库,并以相同的错误消息结束。上面写着。.

$publicKey = 'base64-encoded public key';

$eventWebhook = new EventWebhook();
$ecPublicKey = $eventWebhook->convertPublicKeyToECDSA($publicKey);

SendGrid提供的公钥按照ECDSA库的预期进行base64编码。我已经试过发送它编码,解码和之间的一切:)
转换函数然后调用ECDSA PublicKey类:

public function convertPublicKeyToECDSA($publicKey)
{
    return PublicKey::fromString($publicKey);
}

publickey.php
任何帮助将不胜感激。

rdrgkggo

rdrgkggo1#

谢谢你提出的一个有趣的问题,它让我进入了SendGrid的PHP帮助库的一个部分,我还没有探索过--甚至不知道。
我使用the Mezzio framework创建了a small PHP project,并提供了完整的工作解决方案。要关注的关键文件是 src/App/src/Handler/SendGridWebhookHandler。php.
但是,我所使用的功能的核心(您可以在下面看到)与您在代码示例中分享的内容非常相似。

$eventWebHook = new EventWebhook();
$verifiedSignature = $eventWebHook->verifySignature(
    $eventWebHook->convertPublicKeyToECDSA($publicKey),
    $requestBody,
    $signature,
    $timestamp
);
  • $signatureX-Twilio-Email-Event-Webhook-Signature报头中的值
  • $timestampX-Twilio-Email-Event-Webhook-Timestamp标头中的值
  • $requestBody是请求正文的内容
  • $publicKey是单击“生成验证密钥”后生成的公钥。”,如文件所示。

让我知道,如果它不为你工作,或者如果你有任何问题的代码或为什么我做的事情,因为我有。

相关问题