如何在 PHP 中验证 DKIM 签名?

2022-08-30 23:42:26

我承认我不是很擅长密钥验证。我有一个从POP3服务器下载消息的脚本,我正在尝试验证PHP中的DKIM签名。我已经弄清楚了正文哈希(bh)验证检查,但我无法弄清楚标头验证。

http://www.dkim.org/specs/rfc4871-dkimbase.html#rfc.section.6.1.3

以下是我的邮件头示例。我已经能够使用Mail::D KIM软件包来验证Perl中的签名,所以我知道它很好。我似乎无法弄清楚RFC中的指令并将其转换为PHP代码。

 DomainKey-Signature: q=dns; a=rsa-sha1; c=nofws;
  s=angrychimp-1.bh; d=angrychimp.net;
  h=From:X-Outgoing;
  b=RVkenibHQ7GwO5Y3tun2CNn5wSnooBSXPHA1Kmxsw6miJDnVp4XKmA9cUELwftf9
  nGiRCd3rLc6eswAcVyNhQ6mRSsF55OkGJgDNHiwte/pP5Z47Lo/fd6m7rfCnYxq3
 DKIM-Signature: v=1; a=rsa-sha1; d=angrychimp.net; s=angrychimp-1.bh; c=relaxed/simple;
  q=dns/txt; i=@angrychimp.net; t=1268436255;
  h=From:Subject:X-Outgoing:Date;
  bh=gqhC2GEWbg1t7T3IfGMUKzt1NCc=;
  b=ZmeavryIfp5jNDIwbpifsy1UcavMnMwRL6Fy6axocQFDOBd2KjnjXpCkHxs6yBZn
  Wu+UCFeAP+1xwN80JW+4yOdAiK5+6IS8fiVa7TxdkFDKa0AhmJ1DTHXIlPjGE4n5;
 To: iptest@example.com
 Message-ID: <EF.CC.24859.F1DCA9B4>
 From: DKIM Tester <noreply@angrychimp.net>
 Reply-To: noreply@angrychimp.net
 Subject: Automated DKIM Testing (angrychimp.net)
 X-Outgoing: dhaka
 Date: Fri, 12 Mar 2010 15:24:15 -0800
 Content-Type: text/plain; charset=iso-8859-1
 Content-Transfer-Encoding: quoted-printable
 Content-Disposition: inline
 MIME-Version: 1.0
 Return-Path: noreply@angrychimp.net
 X-OriginalArrivalTime: 12 Mar 2010 23:25:50.0326 (UTC) FILETIME=[5A0ED160:01CAC23B]

我可以从我的DNS中提取公钥,我相信我正确地规范了标头,但我就是无法验证签名。我不认为我正在准备密钥或正确计算签名验证。

这是可能的(我需要梨扩展还是其他什么?)还是在PHP中手动验证DKIM签名是不可行的?


答案 1

Mail::D KIM 对其他库具有以下依赖关系:

  • Crypt::OpenSSL::RSA
  • 摘要::SHA
  • 邮件::地址(邮件工具包的一部分)
  • 哑剧::基地64
  • 网络::D

所有这些都应该在PHP中可用。所以手动检查PHP中的有效性是可控的。Mail::D KIM正在用这些库“手动”验证签名。也许你有一个高峰进入邮件来源::D KIM?

此外,“OpenDKIM Library (libopendkim)”是可用的。你可以围绕这个库构建一个PHP模块,就像其他人将OpenSSL,cURL等集成到PHP中一样。

也许你可以在你的验证函数的代码中提供一些测试数据,这样每个人都可以看看它?

HTH和最好的问候

迈克尔


答案 2

尝试与外部工具或其他语言进行互操作。

您可以考虑调整外部工具来执行此操作,或者使用C库,该库具有更好的支持来使用DKIM。你也可以尝试通过Perl或Python进行集成。


推荐