Exim

DKIM 和請求跟踪器標頭

  • May 15, 2017

我有一個發送兩種不同類型電子郵件的域:一種是通過自動化流程創建的,例如發送給使用者的通知,另一種是從 Request Tracker(票務系統)生成的。

不久前我們設置了 DKIM,我犯了一個錯誤,即從未驗證這兩種類型的電子郵件是否正常工作,因此我從未檢查過 RT 電子郵件。最近我們意識到 RT 生成的消息偶爾會遇到垃圾郵件過濾器,感覺 DKIM 檢查失敗可能與其中有關。

RT 為每條消息添加一些標頭,例如:

X-RT-Loop-Prevention: Support
RT-Ticket: Support #3165
Managed-by: RT 3.8.2 (http://www.bestpractical.com/rt/)
RT-Originator: xxx@xxx.com
X-RT-Original-Encoding: utf-8 

但是,這些標頭不會出現在 DKIM 簽名中。例如,這是今天早上來自 Gmail 的硬故障字元串:

Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of www-data@mx1.xxx.com designates xxx.xxx.xxx.xxx as permitted sender) smtp.mail=www-data@mx1.xxx.com; dkim=hardfail header.i=@xxx.com
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=xxx.com; s=mta;
   h=Date:Content-Type:Content-Transfer-Encoding:MIME-Version:To:Message-ID:References:In-Reply-To:Reply-To:From:Subject; bh=GDIpYEyFTXB3RPUtFDKxW+iBpkOYngdUELnMw316Ohk=;
   b=A6iZYrFUZ68gszu/KeTyMoUUE0jbGlZ+yxcz72gq7Bdxe+jAkcgFoExN+duxLPIZqJm87Gz+XCB9IwnQbKC5lsVKK8cwUzQTHZx6E8ZPyynkv0NvC8MStDgOswFnjdcy;

如您所見,RT 標頭不包含在 DKIM 簽名中。從 RT 之外的站點發送郵件時,Gmail 會正確驗證簽名。

我的理解是 DKIM 會忽略“自定義”標題 (X-xxxxxxxx),但其他標題則不會,例如上面的 RT-Ticket、Managed-by 和 RT-Originator。

有沒有人對此有任何詳細的經驗,或者知道我在哪裡可以讓 DKIM 將這些標頭包含在簽名中?我已經通過 RT 支持進行了一些搜尋,但找不到太多。我使用 exim 作為 MTA,系統是 Debian Lenny。

編輯:我可能在這裡用標題欄位吠叫錯誤的樹,我不確定。我修改了 exim 配置,通過從 RFC4871 ( https://www.rfc-editor.org/rfc/rfc4871 ) 中獲取標頭列表並添加 RT 正在添加的額外標頭,明確告訴它要查看哪些標頭,像這樣:

 dkim_sign_headers = From:Sender:Reply-To:Subject:Date:Message-ID:To:Cc:MIME-Version:Content-Type:Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:Precedence:X-RT-Loop-Prevention:RT-Ticket:Managed-by:RT-Originator:X-RT-Original-Encoding

這導致所有 RT 標頭都正確添加到簽名中,但是,Gmail 在通過 RT 時仍然報告簽名出現硬故障。據我所知,RT 使用 exim 的方式與使用任何其他外部程序的方式相同,所以我無法解釋為什麼這些消息會失敗。

將在此處發布半答案,以防有人遇到類似問題並通過搜尋找到此問題。

在 exim 中使用寬鬆的標頭規範化進行 DKIM 簽名時,我無法解決此問題。我以我的 RT 生成的郵件範例為例,這些郵件的簽名在 Gmail 和 Yahoo 郵件中均失敗,然後像這樣測試它們:

  1. 我使用 PHP 來實現文件 ( http://www.dkim.org/specs/rfc4871-dkimbase.html )中指定的 DKIM 簽名算法。當我以放鬆/放鬆的方式通過它執行我的消息時,我產生了與我的 exim 產生的相同的正文雜湊但不同的消息簽名。
  2. 我使用 PHP 來實現 DKIM 驗證算法,然後獲取 Gmail 和 Yahoo Mail 收到的消息來源並執行它,產生相同的結果。我還執行了不是由我的 Request Tracker 生成但已經通過我的 exim 的消息,並且它們在我的驗證測試中正確通過,就像在 Gmail 和 Yahoo Mail 上一樣(這樣做的目的是證明我的鍵和其他配置在 RT 的上下文之外正常工作,它們似乎是)。
  3. 在這一點上,我認為我的 exim 在輕鬆/放鬆地處理 DKIM 登錄的方式中存在錯誤或配置錯誤。我下載了 exim 使用的 PDKIM 庫的原始碼 ([ https://github.com/duncanthrax/pdkim] ),對其進行了編譯,然後修改了測試範例以匹配我的密鑰、設置和測試消息。執行測試後,我產生了與我的 PHP 實現相同的結果:相同的雜湊、相同的簽名。

這給我留下了最後一個選擇,那就是弄亂 exim 的來源,以嘗試確定導致消息簽名更改的特定場景。但是,我想花多少時間在這方面已經達到了我的極限。

簡單的解決方案是將我的 exim 配置改回簡單的規範化,這導致 Gmail 和 Yahoo Mail 都通過了 dkim 驗證來驗證我的 Request Tracker 生成的消息。不是我想要的,但現在已經足夠了。

引用自:https://serverfault.com/questions/205707