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