【问题标题】:How do I verify a DKIM signature in PHP?如何在 PHP 中验证 DKIM 签名?
【发布时间】:2011-01-31 10:10:00
【问题描述】:

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

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 签名不可行?

【问题讨论】:

  • 我将标题放入代码标签中,如果您不喜欢它可以随意回滚,但我认为它更易于阅读。
  • 谢谢。我以为我已经做到了,但我想我搞砸了。
  • 你搞清楚了吗?

标签: php rsa sha1 dkim


【解决方案1】:

我在 googlecode 中创建新项目。名字是phpMailDomainSigner 它支持面向对象风格的 DKIM-Signature 和 DomainKey-Signature。

【讨论】:

    【解决方案2】:

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

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

    所有这些都应该在 PHP 中可用。所以手动检查PHP中的有效性是可控的。 Mail::DKIM 正在使用这些库“手动”验证签名。也许您对 Mail::DKIM 的来源有一个高峰?

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

    也许你可以把你的verify-function的代码提供一些测试数据,让大家看看?

    HTH 和最好的问候

    迈克尔

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 实际上我暂时已经这样做了,将我的完整邮件内容传递给一个 Perl 脚本,该脚本使用 Mail::DKIM 包验证签名。我仍在追求原生 PHP 解决方案,所以如果/当我能够编写一个类或扩展时,我会更新这个问题。感谢大家的帮助。
      • 最好让您的 MTA 通过类似 opendkim 的方式传递邮件,然后在 PHP 中,您只需检查 opendkim 写入的标头的内容 - 尽管具体取决于您如何处理此邮件。也许您应该添加有关您正在做什么的详细信息?
      猜你喜欢
      • 2012-07-28
      • 2018-12-13
      • 2012-05-28
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      • 1970-01-01
      相关资源
      最近更新 更多