DKIM認証が失敗する原因と認証結果の確認方法を詳しく解説!失敗を防ぐ方法とは?
![DKIM認証が失敗する原因と認証結果の確認方法を詳しく解説!失敗を防ぐ方法とは? のアイキャッチ画像](https://blastengine.jp/wp-content/uploads/2024/06/dkim-authentication-fails.jpg)
現代では、スパムやフィッシング攻撃が増加する中でメールの信頼性とセキュリティはますます重要な課題となっています。特にビジネスで利用するメールにおいては正当なメールが確実に受信者に届き、その内容が改ざんされていないことを保証する技術は不可欠です。
そのため、多くの企業や組織がSPFやDKIMなどの認証技術を採用しています。本記事では主にDKIMについて取り上げますが、DKIM認証は常に成功する訳ではありません、
その原因は、レコードのセットアップやDKIMプロトコルの識別子のアライメントで問題が発生している、などが考えられます。
今回はDKIMの仕組みや認証が失敗する原因とその対策などを詳しく解説します。ビジネス上でメールを利用している方、特にメールを送信する機会がある方は最後までご覧ください。
![Gmail送信者ガイドライン対応バナー](http://blastengine.jp/wp-content/uploads/2024/01/gmail要件強化_バナーBE_顕在_1360x350.png)
DKIMとは
DKIMは、Domain Keys Identified Mailの略称で、電子メールの送信ドメイン認証技術のひとつです。
DKIMは、送信者のドメインが正当であることを確認し、メールが改ざんされていないことを保証するために使用されます。これにより、スパムやフィッシング攻撃のリスクを低減し、メールの信頼性を向上させることができます。
DKIMの役割
DKIMの主な役割は、送信者のなりすましやメールの改ざんを検知することです。
メールセキュリティが重要視されるようになった昨今、一斉メール配信や自動メールの送信など、メール配信を行う企業はメール受信者に確実に届けるために、DKIMやSPFといった送信ドメイン認証技術を導入するようになりました。
DKIMを導入することで、正当なメールが迷惑メールと判断されずに受信ボックスに届くようになります。これにより、企業のブランドを損なうことなく、顧客とのコミュニケーションを円滑に行うことができます。
DKIMの仕組み
DKIMの仕組みは、公開鍵暗号方式を利用してメールの送信元を認証し、メールの内容が改ざんされていないことを確認するプロセスです。具体的には以下の手順で動作します。
- 送信者が送信メールサーバーに秘密鍵を登録する
送信者は自分のメールサーバーに秘密鍵を保存し、この鍵を使ってメールに署名を行います。 - 送信者がDNSサーバーに公開鍵を登録する
送信者は自分のドメインのDNSに公開鍵を登録します。この公開鍵は受信者がメールの署名を検証するために使用されます。 - 送信者がメールヘッダ・本文から作成されたハッシュに秘密鍵を用いて電子署名をする
送信者はメールのヘッダ情報や本文からハッシュを生成し、秘密鍵を使ってこのハッシュに電子署名を行います。 - DKIM-Signature(電子署名)をメールヘッダに付与する
生成されたDKIM-Signatureがメールヘッダに追加されます。これにより、受信者はこの署名を検証することができます。 - 受信者が受信したメールヘッダ・本文からハッシュを作成する
受信者はメールを受信すると、ヘッダ情報や本文からハッシュを生成します。 - 受信者が公開鍵を用いて電子署名からハッシュの復号を行う
受信者は送信者のDNSから公開鍵を取得し、この鍵を使ってDKIM-Signatureを復号し、元のハッシュを取得します。 - 受信者が算出したハッシュ値と復号結果のハッシュ値を照合する
受信者は自分で生成したハッシュと、復号したハッシュを比較します。 - 一致すればメールの改ざんが行われていないと判断する
ハッシュが一致すれば、メールが改ざんされていないことを確認し、送信者が正当であると判断します。
これらのプロセスを通じて、DKIMはメールの信頼性を保証し、メールのセキュリティを強化します。DKIMは単独で使用されることもありますが、SPF(Sender Policy Framework)やDMARC(Domain-based Message Authentication, Reporting & Conformance)と併用することで、さらに高いセキュリティレベルを実現できます。
DKIMについての詳細は以下の記事で詳しく解説していますので、併せてご確認下さい。
DKIM認証が失敗する原因
前述したようにDKIMの仕組みは複雑なため、DKIMを正しく設定したつもりでも認証に失敗することがあります。
ここでは、DKIM認証が失敗する原因を詳しく見ていきましょう。
DKIMレコードの構文が間違っている
原因としてよくあるのが、DKIMレコード構文の間違いです。
DKIMレコードの構文を設定する際、手作業での作成は難しいため、DKIMレコードを自動生成するツールを使用することもあるでしょう。しかし、自動生成されたDKIMレコードを手動でドメインに設定すると、間違ったDKIMレコードの構文を実装してしまうおそれがあります。
そうなると、DNSサーバーで構文エラーが発生し、DKIM認証に失敗します。これを防ぐためには、DKIMレコードを設定する際に正確なフォーマットであることを確認し、適切なツールを使用して検証することが重要です。
DKIM識別子のアライメント失敗
DKIM識別子のアライメント失敗とは、「DKIM認証ドメインと送信元メールアドレス(ヘッダFrom)を照合する際にエラーが発生した」という意味です。
DKIMの認証ドメインと送信元メールアドレスは一致している必要があり、一致しない場合はDKIM認証に失敗します。
なお、アライメントは調整と表記されることがあり、SPFアライメント=SPF調整、DKIMアライメント=DKIM調整は同じ意味です。アライメントの設定を正しく行うことで、この問題を防ぐことができます。
サードパーティのメールベンダーでDKIMが無効となっている
昨今ではメール配信システムを使ってメール配信をしているケースがほとんどです。ISPやキャリアなどはメールのセキュリティを強化しており、自社のメールサーバーから一斉配信をする場合これらのセキュリティに弾かれてしまう可能性が高いです。
また、バウンスメールやIPレピュテーションの管理、ブラックリストへの対応など、エンジニアが対応すべきことは様々あります。このような背景からも、メール配信に特化したサービスを使うことが主流となっています。
もちろん、メール配信システムを使っていても、DKIMの設定は可能となります。ただし、利用しているツールがDKIMに対応していなかったり、設定が正確にできていない場合はDKIM認証が失敗してしまいます。
例えば、国内向けメール配信エンジン「ブラストエンジン」であればDKIMを設定することが可能ですし、以下のようなDKIM設定のマニュアルも用意されています。
国内産のツールと言うこともあり、電話やメールなど手厚いサポートがあるので、設定に困ったときでも安心です。
DKIMが無効なサーバーからのメール送信
メール送信はサーバーを介して行われますが、DKIMが無効なサーバーから送信されることがあります。このような場合もDKIM認証は失敗します。
この問題は自社では解決できないため、通信相手にDKIMが有効な状態か確認してもらいましょう。また、自社で管理しているメールサーバーがDKIMをサポートしていることを確認し、必要な設定を行うことも重要です。
メール転送エージェントによる本文の改変
メール転送エージェント(MTA)は、メールに記載された行の折り返し処理やコンテンツのフォーマットを行う際に、記載された内容を変更する(改行する)ことがあります。
これらの処理は、受信者が読みやすいよう自動的に行われますが、処理した結果メールの内容が改ざんされたとDKIMが誤判定するケースがあるのです。
DKIMはSPFとは異なり、メールの内容が改ざんされていないことを保証しますが、送信者のIPアドレスやリターンパスの検証は行いません。行の折り返し処理やコンテンツのフォーマットが自動的に処理された場合、DKIMでは送信者のIPアドレスやリターンパスの検証を行わないため、DKIM認証に失敗します。
これを防ぐためには、MTAの設定を確認し、メールの改変が最小限に抑えられるようにすることが重要です。
DNSサーバーの停止
DNSサーバーはDKIM認証に限らず、インターネットを利用するうえで欠かせないサーバーです。DNSサーバーが停止すると、DKIMの認証に失敗します。これは、DKIM認証で必要な公開鍵を受信者が取得できないためです。
DNSサーバーが停止する理由はさまざまですが、サーバーの障害やメンテナンス、外部からの攻撃などが考えられます。この問題を防ぐためには、DNSサーバーの冗長性を確保し、定期的なメンテナンスと監視を行うことが重要です。
OpenDKIMの使用
OpenDKIMは、DKIMの署名・検証の実装を行うソフトウェアのことです。一般的にGmailやYahoo!メールなどのメールボックスプロバイダーで使用されており、検証時にポート8891を使用してサーバーに接続します。
OpenDKIMで認証に失敗する理由は、間違えてアクセス権限を設定した結果、サーバーがソケットへの関連付けができなくなるためです。このようなエラーが発生した時は、ディレクトリを確認してアクセス権限が正しく設定されているか確認しましょう。
DKIMの認証結果
DKIMの認証結果は、PassやNoneなどさまざまなパターンがあり、それぞれ意味が異なります。ここでは、認証結果の確認方法とパターン例を紹介します。
認証結果の確認方法
DKIMの認証は、メールヘッダを表示してdkim=passと表示されていれば成功しています。認証に失敗した場合、認証結果を確認することで送信側の問題なのか、受信側の問題なのかを確認できます。
メールヘッダのDKIMの欄にFAILと表示されている場合、DKIM認証に失敗しているため、詳細を確認しましょう。
なお、DKIM認証結果の詳細の例文は以下の通りです。
Authentication-Results:
smtp.mailfrom=sample.com;
dkim=pass (2048-bit key) header.d=sample.com header.i=@sample.com header.b=abc123;
spf=pass smtp.mailfrom=sample.com;
dmarc=pass (p=none dis=none) header.from=sample.com;
arc=pass (i=1 spf=pass dkim=pass dmarc=pass);
認証の結果を簡単に解説すると以下の通りです。
smtp.mailfrom=sample.com:
メールの送信元ドメインが sample.com であることを示しています。
dkim=pass (2048-bit key) header.d=sample.com header.i=@sample.com header.b=abc123:
- dkim=pass: DKIM認証が成功したことを示しています。
- (2048-bit key): 使用された鍵の長さが2048ビットであることを示しています。
- header.d=sample.com: DKIM署名が sample.com ドメインに関連していることを示しています。
- header.i=@sample.com: DKIM署名の識別子が @sample.com であることを示しています。
- header.b=abc123: DKIM署名のハッシュ値が abc123 であることを示しています。
spf=pass smtp.mailfrom=sample.com:
- SPF認証が成功したことを示しています。送信元ドメインが sample.com であり、そのIPアドレスが許可されていることを示しています。
dmarc=pass (p=none dis=none) header.from=sample.com:
- DMARC認証が成功したことを示しています。
- (p=none dis=none): DMARCポリシーが none(報告のみ)で、サブドメインのポリシーも none であることを示しています。
- header.from=sample.com: メールのFromヘッダが sample.com であることを示しています。
arc=pass (i=1 spf=pass dkim=pass dmarc=pass):
- ARC認証が成功したことを示しています。
- (i=1): ARCのインスタンス番号が1であることを示しています。
- spf=pass: SPF認証が成功したことを示しています。
- dkim=pass: DKIM認証が成功したことを示しています。
- dmarc=pass: DMARC認証が成功したことを示しています。
認証結果のパターン例
認証結果のパターン例は以下の通りです。
認証結果 | 意味 |
pass | メールがDKIM署名され、署名の検証に成功しました。 |
fail | DKIM署名が存在しますが、署名の検証に失敗しました。 |
none | DKIM署名がメールに存在しません。 |
policy | DKIM署名が存在するが、検証ポリシーにより検証されませんでした。 |
neutral | DKIM署名の検証結果が中立的で、確実な判断ができませんでした。 |
temperror | 一時的なエラーによりDKIM署名の検証ができませんでした。 |
permerror | 永続的なエラーによりDKIM署名の検証ができませんでした。 |
DKIM認証結果とそれに伴うメッセージを理解することで、メールの信頼性や問題点を評価するのに役立ちます。
DKIM認証の失敗を防ぐ方法
DKIM認証の失敗を防ぐには、DKIMレコードの確認、秘密鍵と公開鍵のセットの確認などさまざまな方法があります。それぞれの方法を詳しく見ていきましょう。
DKIMレコードを確認する
DKIMレコードの構文に以下の要素があるとDKIM認証に失敗します。
- 公開鍵が設定されていない
- 不正なタグと値が関連付けられている
- タグと値が関連付けられている(タグ=値)が、値が空になっている
- 無効な文字やスペースが挿入されている
- TXTレコードの文字数制限(ほとんどの場合255文字まで)をオーバーしている
DKIMレコードの構文をチェックするツールを活用し、問題がないように修正しましょう。
秘密鍵と公開鍵のセットを確認する
秘密鍵と公開鍵は一致していなければならないため、不一致の場合はDKIM認証に失敗します。秘密鍵と公開鍵の不一致はDKIM認証に失敗する原因としてよく知られており、鍵の一部が欠落している、設定が間違っているなどが不一致の原因です。
問題が発生している秘密鍵と公開鍵を修正するよりも新しく作り直し、再設定した方が早く解決する可能性があります。
DKIM-Signatureを確認する
DKIM-Signatureに問題がある場合、以下のタグと値に問題がないか確認しましょう。
タグ | 値 | 説明 | 省略 |
v | バージョン | バージョン番号を示す。現時点では、このタグには1と指定する | 必須 |
a | 署名の作成に利用したアルゴリズム | 署名の作成に利用したアルゴリズムを指定する。「rsa-sha1」と「rsa-sha256」が利用できる | 必須 |
b | 電子署名データ | 電子署名データ。Base64にエンコードして指定する | 必須 |
bh | 本文のハッシュ値 | 電子署名の対象とした本文のハッシュ値 | 必須 |
c | メール本文の正規化方式 | 署名作成のときに利用する正規化処理の方法を指定する。“/”で区切り、それぞれヘッダと本文の正規化に利用したアルゴリズムを表示する。「simple」と「relaxedが」指定できる。省略した場合は「simple/simple」になる。詳細については以下の節で述べる | 省略可 |
d | ドメイン名 | 署名を行ったドメイン名。送信ドメイン名である。公開鍵の取得の際に参照するドメイン名の一部になる。後述のiタグに与えられるアドレスのドメイン名は、このタグに与えられる値と同じか、またはサブドメインである必要がある | 必須 |
h | 署名したヘッダ | 電子署名を作成するデータに含まれたヘッダ。“:”で区切って複数列挙できる。送信者を示すヘッダ「From:」や「Sender:」などは必ず署名対象に含める必要がある | 必須 |
i | 認証対象送信者アドレス | メールの送信者や送信プログラム(メーリングリストなどの場合)のメールアドレス。省略した場合は、dタグに指定したドメイン名の先頭に@を追加した値になる | 省略可 |
l | 署名対象本文長さ | 電子署名を行ったメール本文の先頭からの文字長(バイト長)。省略した場合、本文全てを署名対象とする。署名実施するシステムの処理能力とのトレードオフであるが、一般的にあまり小さな値は推奨されない | 省略可 |
q | 公開鍵取得方法 | 公開鍵を取得する方法を指定する。現時点では「dns/txt」のみ指定可能。省略時は「dns/txt」 | 省略可 |
s | セレクタ | 公開鍵を取得する際、クエリを発行する対象のドメイン名の一部に利用する。複数のセレクタを持つことで、1つのドメインで複数の公開鍵を利用できる | 必須 |
t | 署名実施時のタイムスタンプ | 電子署名を作成した日付をEPOC(1970年からの秒数)で指定する。省略時は未定義となる | 利用推奨(省略可) |
x | 有効期限 | 電子署名の有効期限を指定する。有効である日時をEPOC(1970年からの秒数)で指定する。省略した場合、署名は無期限になる | 利用推奨(省略可) |
z | 認証対象としたヘッダのコピー | 動作のテスト目的で付与される。実際の認証処理には利用しない | 省略可 |
引用:一般財団法人インターネット協会「図2 DKIM-Signature:ヘッダの例」
メールの転送ルートを確認する
何らかの原因でメールの転送中にメール情報を改変されることがあります。その場合、DKIM認証結果にbody hash did not verifyと表示され、DKIM認証に失敗します。
メールの転送中にメール情報を改変されてしまう原因は以下の通りです。
- スパムフィルター(迷惑メールフィルター)がかかり、ヘッダが書き換えられた
- メール転送エージェント(MTA)によってメール本文の改行、フォーマットの修正が行われた
また、DKIMが正しく設定されていたとしても経由するサーバーが原因で転送に失敗することもあるため、メールヘッダの情報からどこで失敗しているのかを確認しましょう。
DNSサーバーの稼働状況を確認する
DNSサーバーは、メンテナンス中や何らかの障害が起きた際に停止してしまいます。DNSサーバーが停止すると当然DKIM認証は失敗するため、冗長化を行って可用性を高めておくことが必要です。
冗長化とは、サーバーの故障やアクセス集中による急激な負荷が発生してもサービスを停止することなく、サービスを提供し続けるシステムを構築することです。冗長化しておくと不慮の事故にも対処できます。
もし、外部のDNSサーバーを利用しているなら、より信頼性の高い外部のDNSサーバーへの乗り換えも検討しましょう。
DMARCを併用する
DKIMに加えてDMARCを併用する方法も効果的です。DMARCレポートを受け取り、DKIM認証の結果を確認してみましょう。
そのままのDMARCレポートは可読性に欠けるため、DMARCレポートを解析・可視化するサービスを利用することをおすすめします。
これらのサービスを利用することで、より詳細にどこでDKIM認証が失敗しているのか視覚的にわかるため、解決するための改善策を検証しやすくなるでしょう。
DKIMが設定できるメール配信システムの活用
2023年10月、Gmailのメール送信者ガイドラインがアップデートされました。
2024年2月以降、Gmailアカウントに1日あたり5,000件を超えるメールを送信する送信者は、送信ドメインにSPF・DKIM・DMARCの設定が必要などの記載があります。
このような背景からもメール配信システムを使う場合はDKIMが設定できるかどうかを確認しましょう。
送信ドメイン認証
送信ドメイン認証には「SPF」「DKIM」「DMARC」の3種類あります。DKIMは本記事で説明した通りです。
SPF(Sender Policy Framework)は、メール送信者が正規のドメインからメールを送信しているかを確認するための技術です。
DMARC(Domain-based Message Authentication, Reporting, and Conformance)は、SPFとDKIMの検証結果に基づいて、メール受信者が不正なメールをどのように処理すべきかをドメイン所有者が指示できる技術です。
それぞれの詳細については以下の記事からご確認ください。
API連携・SMTPリレーサービス「ブラストエンジン(blastengine)」の活用
![blastengineのアイキャッチ画像](https://blastmail.jp/blog/wp-content/uploads/2023/11/Screenshot-7.png)
SPFやDKIMなどGmail送信者ガイドライン対応しており、API連携・SMTPリレーが可能なメール配信システムです。
ブラストエンジンは、SMTPリレーサーバーを使用して、簡単に大量のメールを高速配信することが可能です。さらに、メールサーバーを必要とせず、API経由でメールを送信する仕組みも提供しています。
ブラストエンジンは、サーバーの運用やメンテナンスを行っているため、常に高いIPレピュテーションを維持しながら、安全にメールを送ることができます。
以下のような課題がある場合は、ブラストエンジンの利用を検討してみることをおすすめします。
- 自社のIPアドレスやドメインがブラックリストに登録されていて、メールが届かない場合
- 国内キャリアにメールが届かず、対応方法がわからない場合
- 自社でメールサーバーを管理・運用したくない場合
また、ブラストエンジンは各メールプロバイダーや携帯キャリアのドメインに最適化されており、大規模なネットワークを経由してメール配信を行うことで、日本国内での到達率を圧倒的に高めています。
利用料金は月額3,000円からとコストパフォーマンスにも優れており、メールだけでなく、日本語での電話サポートにも対応しています。
メールアドレスの入力のみで無料トライアルが可能ですので、まずは気軽にお試しください。
まとめ
DKIM認証を成功させるためには、基本となるDKIMの仕組みを理解し、失敗する要素が含まれていないか確認しなければなりません。
具体的には、秘密鍵と公開鍵が一致しているか、DKIM-Signatureのタグや値に問題がないかなどを確認します。また、DMARCを併用してDMARCレポートを解析する方法も効果的です。
![Gmail送信者ガイドライン対応バナー](http://blastengine.jp/wp-content/uploads/2024/01/gmail要件強化_バナーBE_顕在_1360x350.png)