2010-03-24 157 views
16

我承認我不擅長密鑰驗證。我擁有的是從POP3服務器下載消息的腳本,我試圖驗證PHP中的DKIM簽名。我已經想出了body hash(bh)驗證檢查,但我無法弄清頭標驗證。如何在PHP中驗證DKIM簽名?

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; [email protected]; t=1268436255; 
    h=From:Subject:X-Outgoing:Date; 
    bh=gqhC2GEWbg1t7T3IfGMUKzt1NCc=; 
    b=ZmeavryIfp5jNDIwbpifsy1UcavMnMwRL6Fy6axocQFDOBd2KjnjXpCkHxs6yBZn 
    Wu+UCFeAP+1xwN80JW+4yOdAiK5+6IS8fiVa7TxdkFDKa0AhmJ1DTHXIlPjGE4n5; 
To: [email protected] 
Message-ID: <EF.CC.24859.F1DCA9B4> 
From: DKIM Tester <[email protected]> 
Reply-To: [email protected] 
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: [email protected] 
X-OriginalArrivalTime: 12 Mar 2010 23:25:50.0326 (UTC) FILETIME=[5A0ED160:01CAC23B] 

我可以提取我的DNS就好了公共密鑰,並且我相信我正確的進行規範化頭,但我就是不能得到簽名驗證。我不認爲我正在準備我的密鑰或正確計算簽名驗證。

這是可能的(我需要梨擴展或什麼?)或手動驗證PHP中的DKIM簽名不可行嗎?

+0

我把標題放入代碼標籤,如果你不喜歡它可以隨意回滾,但我認爲它更容易閱讀。 – 2010-03-24 19:06:12

+0

謝謝。我以爲我已經做到了,但我想我搞砸了。 – angrychimp 2010-03-24 19:09:23

+0

你知道了嗎? – Xeoncross 2012-11-15 17:26:26

回答

5

的郵件:: DKIM對其他庫下面的依賴關係:

  • 地穴:: OpenSSL的:: RSA的MailTools包
  • 摘要:: SHA
  • 的Mail ::地址(部分)
  • MIME :: Base64編碼
  • 的Net :: DNS

所有這些建議立即進行刪除d也可以在PHP中使用。所以手動檢查PHP中的validatity是可控的。 Mail :: DKIM正在使用這些庫「驗證」手動簽名。也許你有一個高峯到源:: DKIM?

另外有「OpenDKIM Library (libopendkim)」可用。您可以圍繞此庫構建PHP模塊,就像其他人已將OpenSSL,cURL等集成到PHP中一樣。

也許你可以提供你的驗證功能的代碼與一些測試數據,所以每個人都可以看看它?

HTH &問候

邁克爾

2

嘗試與外部工具或其他語言進行互操作。

您可以考慮使用外部工具來做到這一點,或者使用C庫來更好地支持與DKIM一起工作。您也可以嘗試通過Perl或Python進行集成。

+0

我實際上已經完成了這個工作,將我的完整郵件內容傳遞給Perl腳本,該腳本使用Mail :: DKIM包來驗證簽名。 我仍然在追求原生的PHP解決方案,所以如果/當我能夠編寫一個類或擴展時,我會更新這個問題。感謝大家的幫助。 – angrychimp 2010-04-16 21:09:16

+0

最好讓你的MTA通過類似opendkim的郵件傳遞郵件,然後在PHP中你只需檢查opendkim寫入的郵件頭的內容 - 具體取決於你是如何處理這封郵件的。也許你應該增加關於你在做什麼的細節? – mc0e 2014-09-13 18:54:36