BLOG ベアメールブログ
2023.10.13 (金)
HowToガイドDKIM認証が失敗する原因とは? DKIM failの修正方法
Last Updated on 2024.08.5
メールを確実に配信するために、送信ドメイン認証の一つである「DKIM」を設定することは有効な施策です。DKIMはメールが送信時点から改竄されていないことを検証し、信頼性を高めます。しかし「なぜかDKIM認証が失敗してしまう」という経験がある方も多いのではないでしょうか。本記事では、DKIMの概要から認証結果の見方、失敗する原因、確認ポイントと対策まで詳しく解説します。
目次
DKIMとは
DKIMとは「DomainKeys Identified Mail」の略称で、電子メールにおける送信ドメイン認証技術の1つです。電子署名を利用してメールの検証を行うことで、メール内容の改竄や送信者のなりすましを検知します。
メールセキュリティへの関心が高まっている近年、迷惑メール対策に有効なDKIMが重要視されています。メール配信を行う企業にとっても、DKIMを活用することで自社のメールの信頼性と到達率を高める効果が期待できるでしょう。
DKIMの仕組み
DKIMは、送信者がメールに電子署名を行い、受信者がその電子署名を検証することによって送信元ドメインの正当性を判断します。この結果に応じて、迷惑メールかどうかを確認し、受信拒否などの対応をすることが可能です。
具体的には、送信者が送信メールサーバーに自分しかわからない「秘密鍵」を登録し、DNSサーバーに「公開鍵」を登録します。メール送信時にメールヘッダ・本文をもとに作成されたハッシュに対して秘密鍵を使って電子署名を作成し、DKIM-Signatureとしてメールヘッダに付与します。
受信者は、受信したメールヘッダ・本文からハッシュを作成します。また、公開鍵を用いて電子署名からハッシュを復号します。最後に、受信者が計算したハッシュ値と復号した結果であるハッシュ値を照合し、一致すればメール作成者の正当性とメールが改竄されていないことが判断できる仕組みです。
作成者署名と第三者署名
DKIMの電子署名の種類には、作成者署名と第三者署名の2つがあります。これらの違いについて解説します。
作成者署名
メール作成者(メールに表示される送信者:Header-From)のドメインで署名する方式です。
自社のメールサーバーで署名を行い、自社のDNSサーバーに公開鍵を登録します。手間はかかりますが、Header-FromのドメインとDKIMで認証するドメインを一致させられるのでDMARCの認証にも合格できます。
第三者署名
メール作成者(送信者)とは異なるドメインで署名する方式です。
たとえば外部のメール配信サービスを利用する場合、そのメールサービス事業者のドメインで署名を行い、公開鍵の設定などもサービス事業者が行います。自社でDKIMの仕組みを構築する必要がなく手軽ですが、Header-FromのドメインとDKIMで認証するドメインが一致しないのでDMARCの認証には失敗します。DMARCを導入し、認証に合格するには別途対応が必要になります。
DMARC認証の仕組みについて詳しく知りたい方はこちらの記事をご参照ください。
DMARCのアライメントとは? DMARC認証をクリアするためのポイント| ベアメールブログ
DKIMの認証が失敗する原因
DKIMを設定して正当なメールを送信しているにも関わらず、失敗することがあります。この原因について解説します。
DKIMの認証結果の確認方法
メールのヘッダから、そのメールがDKIM認証に合格したかどうかを確認できます。メールヘッダを表示し、「dkim=pass」の文字列があればDKIM認証に合格していることがわかります。もし合格しない場合は、別の受信者にメールを送信してみることで送信側に問題があるのか受信側に問題があるのかを確認することも可能です。
例えばGmailの場合、メールを開き、メール右上の縦三点ボタン(その他)をクリックし「メッセージのソースを表示」を押すと、メールヘッダの情報を確認することができます。
以下のように概要が表示されるため、DKIMの認証結果は一目でわかります。もし”FAIL”となっている場合は失敗しているため、ヘッダ情報の詳細を確認しもう少し詳しく調べることをお勧めします。
ソースはなかなか読みづらいため、ブラウザの機能で「dkim」と検索すれば該当箇所を素早く見つけることができます。
Authentication-Resultsの「dkim=******」となっている箇所が認証結果です。認証結果の種類と意味については次項で解説します。
メールヘッダの内容や確認方法について詳しく知りたい方は、以下のブログをご参照ください。
メールヘッダからわかること、確認・解析方法を紹介 | ベアメールブログ
DKIM認証結果の一覧
メールヘッダのAuthentication-Resultsで表示されるDKIMの認証結果には以下のパターンがあります。
認証結果 意味 考えられる要因 Pass 認証に合格した – None DKIM署名がない DKIMを導入していない、DKIM-Signatureが付与されていない Fail 認証に失敗した メールが転送途中のMTA(SMTPサーバー)で変更されたか、DKIMレコードに重大なエラーがある可能性 Neutral DKIM署名が存在しないか、DKIM署名は存在するがPassしなかった DKIM署名がある場合にこの結果が出た場合、検証を妨げる構文エラーがあったか、追加情報がないエラーが発生している可能性 Temperror DKIM認証において一時的なエラーが発生した 何らかの理由でDNSから公開鍵を入手できなかったなど、一時的と考えられる不具合 Permerror DKIM認証において永続的なエラーが発生した 認証に必要なDKIM-Signatureのフィールドが欠落しているなど、永続的な不具合 Policy DKIM署名は存在するが、受信側メールボックスプロバイダーが受け入れなかった 受信側のローカルポリシーによるものだが、DKIM鍵の長さが短すぎることを意味している場合がある
DKIM認証の結果は、検証を行う受信メールサーバーのポリシーによって多少の差異が生じ、ある受信サーバーでは「Fail」となったが、他の受信サーバーでは「Neutral」となるというような場合もあります。また、認証結果の後ろに()やreason=という形でエラーの簡易的な説明が追記されるため、その説明をヒントにどこに問題があるか切り分けを行うと良いでしょう。
認証結果に追記されるメッセージの例
- dkim=fail(signature did not verify):署名が検証されなかった
- dkim=fail(body hash did not verify):ボディ・ハッシュが検証されなかった(メッセージのボディが変更されている)
- dkim=fail(key not found in dns):DNSに鍵が見つからなかった
- dkim=fail(invalid public key):無効な公開鍵
- dkim=fail(signature syntax error):署名の構文エラー
- dkim=neutral(bad format):悪いフォーマット
- dkim=neutral(bad version):悪いバージョン
- dkim=neutral(invalid public key):無効な公開鍵
- dkim=temperror(dns unavailable):DNSに接続できない
- dkim=temperror(key query timeout):鍵取得クエリがタイムアウトした
- dkim=temperror(no key for signature):署名のための鍵がない
- dkim=permerror(bad key):悪い鍵
- dkim=permerror(0-bit key):0bitの鍵
- dkim=permerror(key too long):鍵データが長すぎる
- dkim=permerror(signing time is in the future):署名時間が未来
DKIMの失敗を防ぐための対策
では、DKIMの失敗を防ぐにはどうしたらよいでしょうか。確認のポイントと具体的な対策について解説します。
メールサービスの指定する方法を確認する
サードパーティのメールサービスを利用している場合、DKIMを設定する方法はサービス事業者によって異なります。利用しているサービスの指示通りに設定ができているか確認し、それでも失敗する場合はサービス事業者に問い合わせるようにしましょう。
秘密鍵と公開鍵のセットを確認する
DKIM認証が失敗する主な要因は、秘密鍵と公開鍵の不一致と言われています。秘密鍵や公開鍵の一部が欠落してしまっているか、設定が間違っていることが多いようです。秘密鍵と公開鍵のキーペアを新しく作り直して再設定するだけで解決する場合があります。
DKIMレコードが正しいことを確認する
DKIMレコードに問題があると考えられる場合は、DKIMレコードの構文を確認します。
- p=のタグが存在し、公開鍵が設定されていることを確認する。
- 不正なタグ=値のペアがないか。DKIMレコードのタグと指定する値に間違いがあると検証エラーの原因となります。
- タグ=値のペアで値が空になっているものがないか。値が空になっていると検証エラーの原因となります。
- 無効な文字や余分なスペースなどが原因で、タグが認識できなくなっていないか。余分な空白や改行が挿入されてしまうと、検証失敗の原因となります。
- TXTレコードの文字数制限をオーバーしていないか。
DKIMレコードについてはDKIMレコードの構文をチェックできるツールなどを使用すると簡単に確認できます。MX toolboxなどのDKIM Record Lookup などで確認可能です。
MX Toolbox「DKIM Record Lookup」https://mxtoolbox.com/dkim.aspx
TXTレコードの文字数制限は、利用しているDNSサーバーの仕様によって異なりますが、多くのDNSサービスで255文字までに制限されています。2048bitのDKIM鍵を使用している場合、255文字を超えてしまうため対策が必要になります。
- DKIMレコードの値(テキスト)を、255文字以下になるように分割する
- 分割したテキストをそれぞれ引用符(””)で囲む
- DNSのTXTレコードの値フィールドに順番に入力する
ドメイン名 | タイプ | 値 | TLL |
---|---|---|---|
selector._domainkey.example.com | TXT | “v=DKIM1; k=rsa; p= 6F50EF3B3C6A9D96326A2E6F89556CB3””o7gLrvo6yRtdz9ICe6Fz5sgz0WYFW5nCV4Dma C37E0266TcS25Tfg ” | 3600 |
DKIM-Signatureが正しいことを確認する
DKIMのSignatureに問題があると考えられる場合は、送信メールサーバーで署名を行うDKIMパッケージ(OpenDKIMなど)の設定や稼働に問題がないか確認します。
- 不正なタグ=値のペアがないか。DKIM-Signatureのタグと指定する値に間違いがあると検証エラーの原因となります。
- タグ=値のペアで値が空になっているものがないか。値が空になっていると検証エラーの原因となります。
- 無効な文字や余分なスペースなどが原因で、タグが認識できなくなっていないか。DKIM-Signatureを挿入する際に余分な空白や改行が挿入されてしまうと、検証失敗の原因となります。
- OpenDKIMなど署名を行うパッケージが正しく稼働しているか。DKIMパッケージとMTAの接続が上手くいっていない場合も署名が正しく行われない原因となります。
以下のDKIM-Signatureヘッダフィールドが必須なため、以下のタグと値に問題がないか確認しましょう。
タグ 値の例 説明 v= 1 DKIMのバージョン d= sample.com 署名に使用するドメイン名 a= rsa-sha256 署名の生成に使用される暗号化のアルゴリズム s= selector 公開鍵を照合するためのDKIMセレクタ名 h= Message-ID: From:To:Date:Subject: 署名したヘッダのリスト b= ausD31EomLFAwdDvBK2O… 電子署名データ。Base64でエンコードして指定する bh= 3a98jY=;BKusD3oAMdDvM… 電子署名が対象としたメッセージ本文の計算されたハッシュ値
メールの転送ルートを確認する
メールヘッダのDKIM認証結果に「body hash did not verify」と表示されている場合、メールが転送中に変更されている可能性があります。
メールが途中で変更されてしまう原因には、主に以下の要因が考えられます。
- メールサーバー(MTA)によって、本文の改行の調整やフォーマットの修正が行われた。
- 迷惑メールフィルター(スパムフィルター)によってヘッダが書き換えられた。
送信時にDKIMが正しく設定されていても経由するサーバーが原因で失敗することもあるため、メールヘッダを確認し、どの時点で失敗しているのか調べてみると良いでしょう。
DNSサーバーを冗長化する
DNSサーバーが停止していると、DKIM認証に必要な公開鍵を受信側が取得することができないため、認証が失敗してしまいます。
DNSサーバーが停止してしまう理由は、メンテナンスや障害、外部からの攻撃などさまざまな要因が考えられます。DNSサーバーはDKIMに限らずインターネット通信の要のため、冗長化するなど可用性を高めておくべきでしょう。外部のDNSサービスを利用している場合は、より信頼性の高いサービスへの乗り換えも有効です。
DMARCを導入する
DMARCを導入し、DMARCレポートを受け取れるようにすることで、DKIM認証の結果をレポートで確認することができます。
生のDMARCのレポートデータはそのままでは確認しにくいものですが、DMARCレポートを解析・可視化するサービスもあります。そうしたサービスを活用することで、どのメールサービスプロバイダーでDKIM認証が失敗しているのか統計的に確認しやすくなります。どこで問題が起きているのかの切り分けや、解決に向けた検証も行いやすくなるでしょう。
DMARCの導入方法やレポートについて詳しくはこちらの記事をご参照ください。
DMARCとは? SPF・DKIMとの関係と仕組み、導入方法まで解説 | ベアメールブログ
まとめ
DKIMは電子署名によってメールの正当性を証明する送信ドメイン認証技術の一つです。メールセキュリティの重要性が高まっている今、企業の信頼性を高めるためにもメール配信担当者は必ず実施したい施策と言えるでしょう。しかし、DKIMは正しく設定しているつもりでも失敗してしまうケースも多くあります。ぜひ今回紹介した方法で失敗する原因について調査し、対策してみてください。