DKIMレコード作成・鍵生成ツール

ブラウザ内でDKIM鍵ペアを生成し、公開するDKIMレコードを取得できます。Google WorkspaceやMicrosoft 365をお使いの場合は、鍵はそちらで作成されます。その場所をご案内します。

鍵はブラウザのWeb Cryptoで作成し、送信しません · RFC 6376、8301、8463 · 20の送信サービスのDKIM設定を確認済み
例

example.comの鍵を生成

ブラウザのWeb Cryptoで作成します。秘密鍵がこのタブの外に出ることはありません。

メールに署名するのは?
独自に鍵を作成
鍵の持ち込みに対応
自分の鍵を使用
k鍵の種類

RFC 8301が求める長さです。通常はこれを選びます。

sセレクター
._domainkey.example.com
鍵を新しくするたびに新しい名前を付けます。日付入りの名前なら作成時期がわかります。
tレコードのオプション
詳細設定
ブラウザのWeb Cryptoで作成します。秘密鍵がこのタブの外に出ることはありません。

鍵

秘密鍵 · サーバーで保管分離されたフレーム:ネットワーク接続はなく、このページの他のスクリプトからも読み取れません

オフラインでも動作します。Wi-Fiをオフにして、もう一度生成してみてください。

OpenDKIMを設定

鍵ファイル
# Key file: only the opendkim user may read it
$ sudo mkdir -p /etc/opendkim/keys/example.com
$ sudo nano /etc/opendkim/keys/example.com/s.private
$ sudo chown -R opendkim:opendkim /etc/opendkim/keys
$ sudo chmod 600 /etc/opendkim/keys/example.com/s.private

ローテーション計画

  1. 今日を公開してから、それで署名を始めます。
  2. 6か月後…を作成し、と並べて公開します。
  3. 切り替え…で署名します。
  4. 7〜30日後配送中のメールのために、を公開したままにします。
  5. 失効は削除せず、空の鍵を公開します。v=DKIM1; k=rsa; p=

公開した後に

詳細チェック: example.comリンクにはこの設定が含まれますが、鍵は含まれません。 ブラウザから問い合わせています:CloudflareのリゾルバーとGoogleのリゾルバー(確認用)。

DKIM鍵とDKIMレコードの作成・生成方法は?

RSA 2048の鍵ペアを生成し、秘密鍵はメールに署名するサーバーに保管して、公開鍵をselector._domainkey.自分のドメインのTXTレコードとして公開します(RFC 6376)。

セレクターは、鍵を作るたびに新しい名前(作成した月など)にします。そうすれば、その鍵で署名したメールが配送中でも、古い鍵を公開したままにできます。

次に、署名側に秘密鍵をインストールしてテストメールを送ります。DKIM-Signatureヘッダーには、受信サーバーが参照するドメイン(d=)とセレクター(s=)が示されます。

秘密鍵メールサーバーに保管各メッセージに署名
DKIM-Signature: v=1; a=rsa-sha256; d=example.com; s=s202610; …
公開鍵DNSに公開s202610._domainkey.example.com受信サーバーはこれで検証 ✓
1つの鍵の2つの半分
RSA 2048の秘密鍵を分離したブラウザのフレームに保管するDKIM鍵生成ツールの画面:OpenDKIMのファイルとローテーション計画RSA 2048の秘密鍵を分離したブラウザのフレームに保管するDKIM鍵生成ツールの画面:OpenDKIMのファイルとローテーション計画他のスクリプトから読めない秘密鍵ネットワークに接続できない分離されたフレームの中で作成し、保管します。署名側が読み込む形式PKCS#8、PKCS#1、base64の1行から、署名側に合わせて選べます。リクエストはゼロ、オフラインでも動作「生成」を押してからのネットワークリクエストの数を、リアルタイムで表示します。署名側のファイルOpenDKIM、rspamd、Exim、Postfix、Amazon SES向けに、ドメインとセレクターを埋めて表示します。日付入りのセレクター名前から鍵の作成時期がわかります。下のローテーション計画には、次の鍵と失効の日付が入ります。
OpenDKIM用のRSA 2048鍵をWeb Cryptoで生成した例:秘密鍵はネットワークのない分離されたフレームに保管し、署名側のファイルを埋め、実際の日付つきのローテーション計画を表示します。

DKIMの設定に、自分で鍵を生成する必要はありますか

自社のサーバーでメールに署名する場合だけです。Google Workspace、Microsoft 365、ほとんどのメールサービスは自分で鍵を作成して、公開するレコードを示してくれるため、生成ツールで作った鍵が使われることはありません。

自分の鍵が必要になるのは、Postfix with OpenDKIM、rspamd、Exim、Haraka、自社のアプリ、そしてAmazon SES(BYODKIM)やMailgunのように鍵を受け付けるサービスです。

送信元鍵の作成者公開するものセレクター
Google WorkspaceプロバイダーTXT(先方の鍵)google
Microsoft 365プロバイダー先方の鍵へのCNAMEselector1, selector2
SendGridプロバイダー先方の鍵へのCNAMEs1, s2
Mailchimpプロバイダー先方の鍵へのCNAMEk2, k3
PostmarkプロバイダーTXT(先方の鍵)<date>pm
Brevoプロバイダー先方の鍵へのCNAMEbrevo1, brevo2
Zoho MailプロバイダーTXT(先方の鍵)zoho
Amazon SESどちらでもTXT(自分の鍵)任意
MailgunどちらでもTXT(自分の鍵)任意
OpenDKIM自分TXT(自分の鍵)任意
rspamd自分TXT(自分の鍵)任意
Exim自分TXT(自分の鍵)任意
鍵を作るのは誰か

DKIMレコードには何が入っていますか

selector._domainkey.ドメインにあるTXTレコードで、v=DKIM1、鍵の種類k=、公開鍵p=が入ります。任意のタグで、使えるハッシュ(h=)やサービス(s=)を制限したり、テスト中の鍵(t=)として示したりできます。

p=が空なら、その鍵は失効しています。RSA鍵はSubjectPublicKeyInfoとして公開します(OpenDKIMとrspamdが必須とする形式です)。Ed25519鍵は生の32バイトのままです。

s202610._domainkey.example.com · TXT
v=DKIM1; k=rsa; h=sha256; s=email; p=MIIBIjANBgkqhkiG9w0BAQ…GQIDAQAB
タグ意味既定値
vバージョン。ある場合は先頭DKIM1
k鍵の種類:rsaまたはed25519rsa
h許可するハッシュすべて
sサービス:emailまたは**
ty = テスト中、s = ドメインの完全一致なし
n人向けのメモなし
p公開鍵。空の場合は失効必須
DKIMレコードをタグごとに見る

RSA 1024、2048、4096、Ed25519のどれにしますか

RSA 2048を使ってください。1024は受信サーバーが受け入れる最小の長さで、4096はDNSに負担がかかります。Ed25519は短いものの、独立したテストで大手メールボックスプロバイダーが検証しないことがわかっており、RSA署名と併用する場合にしか役立ちません。

多くのツールは今も1024が既定です。opendkim-genkey、rspamdのdkim_keygen、Microsoft 365がそうです。RFC 8301は2048を求めています。

Ed25519を追加する場合は、RSAでも別のセレクターで署名してください。Yahooは、アライメントの取れた複数の署名のうち1つが失敗すると、DMARCにパスしない場合があります。

RSA 1024234 文字 · 1最小の長さ
RSA 2048410 文字 · 2推奨
RSA 3072582 文字 · 3署名側の対応を確認
RSA 4096754 文字 · 3UDPに収まらない場合あり
Ed2551966 文字 · 1大手プロバイダーは検証しない

255バイトの文字列: 255, 510, 765

鍵の種類ごとのレコードの長さ

OpenDKIM、rspamd、EximでDKIMを設定するには

秘密鍵を署名側だけが読める場所に保管し、署名側の設定でドメインとセレクターをそれに対応付けて、再起動します。タブには、署名側ごとのファイルが、入力した名前で埋められて表示されます。

結果は、自分宛にメールを送ってヘッダーのDKIMの結果を読むか、当サイトのDKIMチェッカーで確認してください。

OpenDKIM · KeyTable · SigningTable
# /etc/opendkim/KeyTable
s202610._domainkey.example.com example.com:s202610:/etc/opendkim/keys/example.com/s202610.private

# /etc/opendkim/SigningTable
*@example.com s202610._domainkey.example.com

# /etc/opendkim/TrustedHosts
127.0.0.1
localhost
Rspamd · dkim_signing.conf
# /etc/rspamd/local.d/dkim_signing.conf
domain {
  example.com {
    selector = "s202610";
    path = "/var/lib/rspamd/dkim/example.com.s202610.key";
  }
}
# only if example.com is a subdomain: use_esld = false;
# only if users log in without @example.com: allow_username_mismatch = true;

$ sudo rspamadm configtest && sudo systemctl restart rspamd
署名側のファイル

DKIMレコードが複数の文字列に分割されるのはなぜですか

2048ビットの鍵のレコードは約410文字で、TXTの文字列1つの上限である255バイトを超えます。そのためDNSは2つの文字列として格納し、検証する側が間に何も挟まずに連結します。

Cloudflare、Azure、cPanelのようなパネルは値全体を受け付けて自動で分割します。Route 53とGoogle Cloud DNSは、引用符で囲んだ文字列を貼り付ける必要があります。GoDaddyは値の上限が1,024文字です。

v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtw0DwsqwlKexAE5H5WDgWwJlEz/C+7FIeL9/Y1TahjkvMvvX+lUQofjxhVmt/yMXVjvgrYb9jZIxtG96iO9qggOWi0vAeClBst4m3rj3O7GjkC/dfbG2BhQBpwJYt6ec76B8y6cyHBZ0+hMWGfAxuLQt/kkiVsaqwRxRQvEuMfnL4L9S8I7evV8GHFihlEgIaM9W8ag4zzL0ZxiEeznDaHYmJDbmgzarExXIY1IuMdpPu1/GmSrq9RCHEifKVvKsOPcmbv2u6xMbW63/EZmPIY78eZRqkioT8TangIPKsP7HEFZRKQwnQJy/OybqexdiFmt29BXBo7A745shhzueGQIDAQAB
1255 B2155 B
s202610._domainkey.example.com. 3600 IN TXT ( "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtw0DwsqwlKexAE5H5WDgWwJlEz/C+7FIeL9/Y1TahjkvMvvX+lUQofjxhVmt/yMXVjvgrYb9jZIxtG96iO9qggOWi0vAeClBst4m3rj3O7GjkC/dfbG2BhQBpwJYt6ec76B8y6cyHBZ0+hMWGfAxuLQt/kkiVsaqwRxRQvEuMfnL4L9S8I7evV8GHFihlEgIa"
	"M9W8ag4zzL0ZxiEeznDaHYmJDbmgzarExXIY1IuMdpPu1/GmSrq9RCHEifKVvKsOPcmbv2u6xMbW63/EZmPIY78eZRqkioT8TangIPKsP7HEFZRKQwnQJy/OybqexdiFmt29BXBo7A745shhzueGQIDAQAB" )
DNSに格納される2048ビットのレコード

DKIM鍵のローテーションはどう行いますか

新しい鍵を新しいセレクターで公開し、署名をそちらに切り替え、配送中のメールのために古いレコードを7〜30日残してから、空のp=で失効させます。M3AAWGは、少なくとも6か月ごとのローテーションを勧めています。

削除せずに失効させると、検証する側は古いセレクターを失効済みと報告します。新しい鍵に、以前のセレクター名を再利用しないでください。

11月12月1月2月3月4月5月6月7月
s202611署名7〜30日間保持p=(失効)
s202705署名
2つのセレクターで引き継ぐ

オンラインでDKIM鍵を生成しても安全ですか

鍵がブラウザ内で作成され、送信されない場合に限ります。このページは、ネットワークに接続できない分離されたフレームの中でWeb Cryptoを使って鍵を作成します。それは、ブラウザの開発者ツールで確認できます。

オンラインの生成ツールの中には、自社のサーバーで鍵を作ってレスポンスで返すものがあり、その場合は鍵がログに残ったり保存されたりするおそれがあります。ブラウザ内で作った鍵は、保存するまでこのタブの中にしか存在しません。

このページの他のスクリプトは、鍵を保持するフレームを読み取れません。また、このページはオフラインでも動作します。Wi-Fiをオフにして、もう一度生成してみてください。

ブラウザ内で作成分離されたフレームオフラインで動作0ネットワークリクエスト
サーバーで作成GET /generate?key_size=2048200 {"private_key": "-----BEGIN…"}ログに残る可能性あり
秘密鍵が通る経路

DKIMレコード作成・鍵生成ツールのよくある質問

DKIMレコードとは何ですか

DKIMレコードは、selector._domainkey.自分のドメインに置くTXTレコードで、鍵ペアの公開側を公開します。メールサーバーは秘密側で各メッセージに署名し、受信サーバーは公開鍵を取得して、メッセージが本当にそのドメインから届き、途中で改ざんされていないかを確認します。RFC 6376で定義されています。

ここでDKIM鍵を生成しても安全ですか

はい。鍵ペアはブラウザ内のWeb Cryptoで、ネットワークに接続できない分離されたフレームの中で作成され、ページの他のスクリプトは読み取れません。何も送信されません。ブラウザの開発者ツールでネットワークのタブが空のままなのを確認できますし、接続を切ってもう一度生成することもできます。

鍵の長さはどれにすればよいですか

RSA 2048です。RFC 8301は署名側に2048ビット以上を求め、GmailとYahooも推奨しており、そのレコードはほとんどのDNSホストに2つの文字列として収まります。1024は受信サーバーが受け入れる最小の長さで、長い値を登録できないDNSホストの場合にだけ使ってください。4096は長いレコードになり、通常のDNS応答に収まらない場合があります。

Google WorkspaceやMicrosoft 365にDKIM鍵は必要ですか

いいえ。Google WorkspaceはAdmin consoleで鍵を作成し、google._domainkey用のTXTレコードを示します。Microsoft 365は、selector1とselector2の2つのCNAMEレコードの先にある鍵で署名します。どの生成ツールで作った鍵も使われることはありません。生成ツールで送信元を選ぶと、公開すべき内容が正確に表示されます。

DKIMのセレクターとは何ですか

セレクターは、._domainkeyの前に付く名前で、受信サーバーにどの鍵を取得するかを伝えます。たとえばs202610._domainkey.example.comのs202610です。これにより、1つのドメインにサーバー、サービス、日付ごとの鍵を同時に持てます。作成ツールは日付入りのセレクターを提案するため、新しい鍵には新しい名前が付き、ローテーションも簡単です。

秘密鍵はどんな形式ですか

既定はPKCS#8のPEM(BEGIN PRIVATE KEY)で、OpenDKIM、rspamd、Eximが読み込めます。一部のツールが案内している従来の形式のPKCS#1(BEGIN RSA PRIVATE KEY)や、Amazon SESのBYODKIMが求める、ヘッダーも改行もないbase64の1行にも切り替えられます。保存するときは、署名側だけが読める権限にしてください。

1つのドメインにDKIMレコードを複数置けますか

はい、別々のセレクターなら置けます。メールに署名するサービスごとに専用のレコードを持て、ローテーション中は一時的に自分の鍵が2つになります。ただし、1つのセレクター名に置けるTXTレコードは1つだけです。同じ名前に2つあると結果が不定になり、検証する側はどちらを選ぶかわかりません。

DKIMレコードが255文字より長いのはなぜですか

2048ビットのRSA公開鍵はbase64で392文字あり、レコード全体では約410文字になります。TXTの文字列は最大255バイトなので、DNSは2つの文字列として格納し、検証する側が間に何も挟まずに連結します。ほとんどのDNSホストは自動で分割しますが、Route 53とGoogle Cloud DNSは引用符で囲んだ文字列が必要です。

DKIMレコードのt=yは何を意味しますか

t=yは、その鍵がテスト中であることを示します。検証する側は、署名が失敗しても、その鍵で署名したメールを未署名のメールとまったく同じに扱わなければなりません。設定の確認中に使い、確認できたら削除してください。テスト中の鍵では、DMARCに何も役立たないためです。t=sは別の意味で、署名のIDにサブドメインではなく、ドメインそのものを使うことを求めます。

DKIM鍵はどれくらいの頻度でローテーションすべきですか

M3AAWGの勧めに沿って、少なくとも6か月ごとです。新しい鍵を新しいセレクターで公開し、署名側をそちらに切り替えて、署名済みのメールが配送中の間は古いレコードを7〜30日残します。その後、古いセレクターは削除せず、空のp=で公開して失効させてください。

足りないものはありますか?機能や新しいツールを提案する