【遺憾砲】Yahoo!メールはなぜDKIM検証に失敗するのか?――「検品前に商品を汚す」おバカな受信処理を暴く

 久々に技術的な「お作法」の悪さに頭を抱える事態に遭遇した。 結論から言おう。Yahoo!メールのDKIM検証システムは、検証を行う前に自らの手でデータを変質させている疑いが濃厚だ。

 まさに、「指紋照合をする前に、相手の指を石鹸でゴシゴシ洗ってしまい、指紋が消えたから偽物だ」と追い返す門番のような振る舞いである。

1. 観測された「おバカ」な事象

 OCN(ceres.ocn.ne.jp)等のISPから送信したDKIM署名付きメールを、GmailとYahoo!で受領し、その「Authentication-Results」を比較した。

項目 Gmail(賢者) Yahoo!(迷える子羊)
DKIM判定 pass (ok) permerror (bad sig)
正規化(c=) simple/simple simple/simple
符号化 quoted-printable quoted-printable

「Googleで通って、Yahoo!で落ちる」。この一点において、送信側の設定不備説は消滅する。悪いのはYahoo!の「器」の狭さだ。

2. 犯行現場:検証前の「余計なお世話」

 DKIM署名は、送信時の「バイナリデータの並び」に対してハンコを押す。 しかし、Yahoo!のゲートウェイは、検証ルーチンにデータを渡す前に、自社システムに適合させるための「お節介な整形」を先行して行っている。

  • 改行コードの強制書き換え: CRLFを勝手にLFに変える。
  • 末尾の空白削除: 「親切心」で1バイト削る。
  • quoted-printableの再梱包: 翻訳し直して行の長さを変えてしまう。

 送信側が採用している c=simple/simple は、一文字の狂いも許さない潔癖な正規化方式だ。Yahoo!が受領後に一箇所でも「良かれと思って」データを撫で回せば、その瞬間に署名は崩壊する。

3. 深まる闇:relaxed すら通用しない絶望

 さらに検証を進めたところ、最も寛容な c=relaxed/relaxed 設定であっても、Yahoo!は bad sig を吐き出すケースが確認された。 これは、Yahoo!の改変が「空白や改行」といった可愛いものではなく、MIME構造やエンコードの再構築といった「不可逆な破壊」を検証前に行っている動かぬ証拠だ。

 Googleが「ありのままの君」を愛してくれるのに対し、Yahoo!は「自分好みの服に着替えさせてから、元の服のサイズと合わない」と文句を言っているのである。実に、おバカさんではないか。

4. 攻略法:おバカな門番を「接待」する

 この「おバカな挙動」に付き合ってやるには、送信側が以下のYahoo!専用接待プロトコルを実装するしかない。

  1. quoted-printable を捨てる: Thunderbird等の設定で 8bit 送信を強制せよ。中計サーバーに「翻訳の隙」を与えるな。
  2. 本文に「肉」を盛る: 短文テストメールは厳禁だ。Yahoo!の整形ロジックが誤作動しないよう、十分な長さの署名や定型文を叩き込め。
  3. 期待しない: Gmailで Pass していれば、そのメールは「国際的には正当」だ。Yahoo!の判定は、地方の頑固な老舗旅館の独自ルール(ローカルバグ)と割り切るのが精神衛生上よろしい。

ななし: