如何在PHP中验证DKIM签名?

18

我承认我在密钥验证方面不是很熟练。我有一个脚本,可以从POP3服务器下载邮件,并尝试在PHP中验证DKIM签名。 我已经找出了正文哈希(bh)验证检查,但无法理解标题验证。

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

以下是我的邮件头的示例。 我能够使用Mail :: DKIM包在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成功提取公钥,并且我相信我正在正确规范化标头,但我无法使签名验证通过。我认为我没有正确准备密钥或计算签名验证。

这是否可能(我需要pear扩展或其他东西?)或者在PHP中手动验证DKIM签名是否不可行?


我把标题放进了代码标签里,如果你不喜欢可以回滚,但我认为这样更容易阅读。 - Pekka
谢谢。我以为我已经做了,但我猜我搞砸了什么。 - angrychimp
你解决这个问题了吗? - Xeoncross
3个回答

5

Mail::DKIM 对其他库有以下依赖:

  • Crypt::OpenSSL::RSA
  • Digest::SHA
  • Mail::Address (MailTools 包的一部分)
  • MIME::Base64
  • Net::DNS

所有这些库在 PHP 中也应该可用。因此,在 PHP 中手动检查有效性是可以控制的。Mail::DKIM 使用这些库“手动”验证签名。也许你可以看一下 Mail::DKIM 的源代码?

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

也许你可以提供带有一些测试数据的 verify 函数的代码,这样每个人都可以查看它?

希望对你有所帮助,祝好!

Michael


2

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

您可以考虑适应外部工具来实现此目的,或使用具有更好支持DKIM工作的C库。您也可以尝试通过Perl或Python进行集成。


我目前已经完成了这个,将我的完整消息内容传递给一个使用Mail::DKIM包验证签名的Perl脚本。我仍在追求一个本地的PHP解决方案,如果/当我能够编写一个类或扩展,我会更新这个问题。感谢大家的帮助。 - angrychimp
最好让你的MTA通过类似opendkim的东西传递邮件,然后在PHP中,你只需要检查opendkim写入的邮件头的内容-具体取决于你如何处理这封邮件。也许你应该添加关于你正在做什么的细节? - mc0e

2

我在Google Code上创建了一个新项目。它的名称是phpMailDomainSigner,支持面向对象的DKIM-Signature和DomainKey-Signature。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接