OpenDKIMで署名したメールをAmazon SES経由で送信してみました

2024.02.21

初めに

先日BYODKIMを利用し独自のキーペアの持ち込みAmazon SESを利用する設定を紹介させていただきました。

BYODKIMを利用することでき、DKIMレコード自体をamazonses.com配下でない独自のものとできるためこの辺りにカスタマイズの余地が生まれます。

ただ引き続き署名処理については手をつけられないため正規化方式をrelaxed/simpleではなくsimple/simpleにしたい等の要望を叶えることができません。

これに対する対応の一つとし独自のメールサーバにてOpenDKIM等で署名を行ったものをAmazon SESをリレーして飛ばすという選択肢があります。

一定独自の送信サーバの管理は必要となるため全てのケースで適用できるわけではありませんが、最終的な送信をAmazon SESをにまとめることでIPの信頼性自体による問題への対処、簡易的な設定で比較的直感的なメールの未着などの調査が可能となるVDMが利用できる、という利点は得られるため別のメールサービスではなくAWSにまとめたいといった様なケースで利用するケースはあるのではないかと考えております。

今回は実際にOpenDKIM+Postfixの設定をしAmazon SESをリレーする形でメールを送信してみます。

事前準備

今回の大元のメール送信はlocalhost上のPostfixから行います。

以前PostifxからAmazon SESをリレーして送信する一例を執筆しておりますのでその周辺の設定については以下をご参照ください。

localhost上のpostfixを利用することで中継するメールサーバのサーバ費用や冗長性の確保をある程度軽減するため状況によっては悪くない選択肢とは個人的には考えております。
(個別のプロセスが落ちるケースは無理だが良くも悪くもインスタンス単位の障害であれば落ちる時はセットなのでまとめて1つのコンポーネントとして見れないこともない)

リレーサーバ個別の設定更新や問題を解決する場合は少し手間ですが、日常的な調査であればログは最終的に送信するAmazon SES側のものを見れば大抵は対応できるとは思います。

OpenDKIMの設定

インストール

まずはOpenDKIMをインストールします。
Amazon Linux 2上での対応で行っていますがepelに含まれる様です。

$  yum install opendkim
...
Dependencies Resolved

========================================================================================================================================================================================
 Package                                       Arch                                  Version                                             Repository                                Size
========================================================================================================================================================================================
Installing:
 opendkim                                      aarch64                               2.11.0-0.1.el7                                      epel                                     221 k
Installing for dependencies:
 libbsd                                        aarch64                               0.8.3-1.el7                                         epel                                      85 k
 libmemcached                                  aarch64                               1.0.16-5.amzn2.0.2                                  amzn2-core                               238 k
 libopendkim                                   aarch64                               2.11.0-0.1.el7                                      epel                                      70 k
 opendbx                                       aarch64                               1.4.6-6.el7                                         epel                                      46 k
 sendmail-milter                               aarch64                               8.14.7-5.amzn2.0.1                                  amzn2-core                                71 k

Transaction Summary
========================================================================================================================================================================================
Install  1 Package (+5 Dependent packages)

キーペアの発行

以降の作業はOpenDKIMのREADMEを参考に設定します。

キーペアについてはopensslコマンド等で発行したものでも可能ですがせっかくなので上記の記載に従いopendkim-genkeyで発行します。 今回はせっかくなのでAmazon SESで署名に利用できない4096bitのキーを使って生成していますが、受信環境側でEDNSに対応していないとレスポンスが1パケットに収まらず名前解決できなくなってしまう関係でDKIMの検証に失敗する可能性がありますのでご注意ください。

% cd /etc/opendkim/
% opendkim-genkey --selector amazonses-relay --bits=4096 --testmode --domain=example.com
#秘密鍵
% cat amazonses-relay.private
-----BEGIN RSA PRIVATE KEY-----
MIIJKgIBAAKCAgEAw6NVkJ9HtrLW3D62aD+MAODUj6Hp1dsCxqhLfURtYYNr1cqV
...
# 公開鍵はpem形式ではなくtxtレコードとして登録可能な形で出力される
% cat amazonses-relay.txt
amazonses-relay._domainkey      IN      TXT     ( "v=DKIM1; k=rsa; t=y; "
          "p=MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuX2DrXIYu2L+t1bFqrFz1dyNlA3pTLcOfpoPZdT/aZHPsRp6UGYPFQteAJ93cTLiDbVYZaC8XiXkRFEDTG7pUSO9pQvWn4qX2i3/zWMRh6XwVzcajyQK/XosV51Qq/h1FVceyE5yFItaAldbp2BcPEs9HNQLpQqcI3JRq5CO4Hwc45o53TodNLWfr/KFw40OTr8jlBOvaqRg5r"
          "idsVHKEn1UBf42sd4Jb3u95EPFrD5hVdPIqSmprrrwFCtwg7m75E5xh7QMpyaZiGmSXKME3nVuvQk7KirDfhmXTUvTLIyl/vUyc/VuuD9Zubr/E/mfaaIXLJyupnqqBNt2NFhvfJlnLwnoO0plVNeYQjDJfy8mVerXhWk9CN/nJ7L4OcCXyVPVwP6qVnVOyUFCWDUgv9lLVv3riXWx0hnBgwgo2P/SpD9a3x6oBl2D8CTigXACPXxewrDG"
          "TsjMuFYfiPjkK/QutXpv5NMCqkhzKbffyYroJAAd5FglAyUKfvfHddWs0IDwx5BTUtfn0tZbeu1eFtOzAcjrdMVNzKkEbvFbHzlp62dKE2hB3eaQzC7PmGj9ScUrLrGItUxBnFO+6HlIS/Gmjo7tef5E7Z/yL7XrL0jswmkyMa1wAm3aBsKkmBy7T2OXCeGN7dStX+Mj5jO6mTqzJ23oM18Vb60WeXFyz6MCAwEAAQ==" )  ; ----- DKIM key amazonses-relay for example.com
# いかにもキーを保存しておくようなディレクトリがインストールのタイミングで作られているのでそちらに移動
% mv amazonses-relay* keys/
# デフォルトはopendkimユーザで起動するのでそちらのユーザが読める様にしておく
% chown opendkim:opendkim /etc/opendkim/keys/amazonses-relay.private

DNSの設定

DKIMキーのレコードをDNSに登録します。
良い感じに文字列を分解してもらっていますが自分の利用しているCloudflareのネームサーバでは"記号は文字列の囲みではなく文字列として扱いエスケープされてしまうので連結して登録します。

登録したレコードの名前解決の結果は以下の通りです。

% dig amazonses-relay._domainkey.example.com txt +short
"v=DKIM1;k=rsa;t=y;p=MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuX2DrXIYu2L+t1bFqrFz1dyNlA3pTLcOfpoPZdT/aZHPsRp6UGYPFQteAJ93cTLiDbVYZaC8XiXkRFEDTG7pUSO9pQvWn4qX2i3/zWMRh6XwVzcajyQK/XosV51Qq/h1FVceyE5yFItaAldbp2BcPEs9HNQLpQqcI3JRq5CO4Hwc45o53TodNLWfr/KFw40" "OTr8jlBOvaqRg5ridsVHKEn1UBf42sd4Jb3u95EPFrD5hVdPIqSmprrrwFCtwg7m75E5xh7QMpyaZiGmSXKME3nVuvQk7KirDfhmXTUvTLIyl/vUyc/VuuD9Zubr/E/mfaaIXLJyupnqqBNt2NFhvfJlnLwnoO0plVNeYQjDJfy8mVerXhWk9CN/nJ7L4OcCXyVPVwP6qVnVOyUFCWDUgv9lLVv3riXWx0hnBgwgo2P/SpD9a3x6oBl2D8CTigX" "ACPXxewrDGTsjMuFYfiPjkK/QutXpv5NMCqkhzKbffyYroJAAd5FglAyUKfvfHddWs0IDwx5BTUtfn0tZbeu1eFtOzAcjrdMVNzKkEbvFbHzlp62dKE2hB3eaQzC7PmGj9ScUrLrGItUxBnFO+6HlIS/Gmjo7tef5E7Z/yL7XrL0jswmkyMa1wAm3aBsKkmBy7T2OXCeGN7dStX+Mj5jO6mTqzJ23oM18Vb60WeXFyz6MCAwEAAQ=="

余談ですが最初試した時に名前解決を中継するルータ側でEDNSの設定が有効になっておらず即座にタイムアウト(挙動としてはRST/ACKが返却される)が発生しこれが512 Byteの壁...というの感じることができました。
(以前からたまに同様に即タイムアウトは見かけていたのですがその謎が解けました)

% dig amazonses-relay._domainkey.example.com txt +short +edns=0
;; Connection to xxxxxxx::1#53(xxxxxx::1) for amazonses-relay._domainkey.example.com failed: connection refused.
;; Connection to xxxx#53(1xxxx) for amazonses-relay._domainkey.example.com failed: connection refused.

利用している機器はUDPのみ利用可能でTCPフォールバック非対応でしたが幸いEDNSには対応しており追加設定をすることで解消はできたため今回はこのまま4096bit鍵を利用します。

opendkim-testkeyコマンドでセレクタの内容と秘密鍵の整合性が取れているかを確認します。

# 成功していれば特に何も出ないタイプのコマンドらしい
% opendkim-testkey -d example.com -k keys/amazonses-relay.private -s amazonses-relay
# キーがペアになっていなかったりレコードが存在しなかったりするとメッセージが出る
% opendkim-testkey -d example.com -k keys/amazonses-relay.private -s rotate-before-dkim-key
opendkim-testkey: keys do not match
% opendkim-testkey -d example.com -k keys/amazonses-relay.private -s hogehoge
opendkim-testkey: 'hogehoge._domainkey.example.com' record not found

設定値の調整・起動

OpenDKIMに署名のための設定を行います。

KeyTableやSigningTableを利用することで複数のドメイン利用時等条件に応じたの鍵ファイルのマッピングが可能なようですが、今回は1ドメインで行いそこまでは不要なので作成しません。

READMEとしてはopendkimコマンドのオプションで指定する方法が記載されていますが素直に設定ファイルを書いたほうが見通しも良いので/etc/opendkim.confを変更して起動します。

初期状態のコメントや改行を除いた設定は以下の通りです。

# この正規表現、実設定だけ見れるので割と好んで利用しています
# 大体毎回忘れて即興で組み立てるので微妙に無駄があったり間違ってたりしますが
% egrep -v "^(\s*#.*)?\s*$" /etc/opendkim.conf
PidFile /var/run/opendkim/opendkim.pid
Mode    v
Syslog  yes
SyslogSuccess   yes
LogWhy  yes
UserID  opendkim:opendkim
Socket  inet:8891@localhost
Umask   002
SendReports     yes
SoftwareHeader  yes
Canonicalization relaxed/relaxed
Selector        default
MinimumKeyBits  1024
KeyFile /etc/opendkim/keys/default.private
OversignHeaders From

デフォルトの設定に記載されているコメント等を参考に以下の様に設定を書き換えました。 Canonicalizationは書き換える必要はないですがAmazon SESの署名ではできないsimple/simpleの正規表現を試してみたいため変更しています。

% egrep -v "^(\s*#.*)?\s*$" /etc/opendkim.conf
PidFile /var/run/opendkim/opendkim.pid
Mode    sv
Syslog  yes
SyslogSuccess   yes
LogWhy  yes
UserID  opendkim:opendkim
Socket  inet:8891@localhost
Umask   002
SendReports     yes
SoftwareHeader  yes
Canonicalization simple/simple
Domain  example.com
Selector        amazonses-relay
MinimumKeyBits  1024
KeyFile /etc/opendkim/keys/amazonses-relay.private
InternalHosts   refile:/etc/opendkim/TrustedHosts
OversignHeaders From
SignHeaders From,To,Subject

/etc/opendkim/TrustedHostsには署名を行うべきホストを書く様ですがデフォルトで127.0.0.1が記載されていたので特に変更していません。
また実際に試す限りですがリレーする場合?はModeはs(署名)、v(検証)どちらか片方だけでなくsv(署名+検証)しにしないと署名されないようです。

https://docs.aws.amazon.com/ses/latest/dg/send-email-authentication-dkim-manual.html
Don't sign the following fields: Message-ID, Date, Return-Path, Bounces-To.

設定で少しハマったのがAmazon SES側の仕様としていくつか署名に利用してはいけないヘッダがある点です(Amazon SES側で書き換えられる?)。
SignHeadersを指定しないデフォルトの状態ではh=From:To:Subject:Date:From;となっており利用を禁止しているDateヘッダが含まれてしる状態となります。

この状態で送信するとdkim=failとなり検証が失敗しますのでご注意ください。

Authentication-Results: mx.google.com;
       dkim=pass header.i=@amazonses.com header.s=zh4gjftm6etwoq6afzugpky45synznly header.b=F49X2bf9;
       dkim=fail (test mode) header.i=@example.com header.s=amazonses-relay header.b=ta94HwOL;
...
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=example.com; s=amazonses-relay; t=1708508647; bh=+qK+xkYRkWOX1w3SSkqyBh1NFCwnIPfFECIp/kKpH+c=; h=From:To:Subject:Date:From; b=ta94HwOLabZKRYDl8mDjVPHeA9N7o4nOmt/UZzU4N7swQoaAHX8To7BmxQtZp49xI
	 tyJM2Wg81rz2toRnwtWRTghk5XzZONxyLlDBes2BPc71qytUb23Ilm0ImALM5domIw
	 RArHsP0rDOc5MDmFxSqV9CHzWA4MIf/Z4lKtiMCpehz3rE/m6bNjTVHO8AG0OTbBCJ
	 Go/+whHrZBlgnKOpK3OatIseM5TJjgJbQ3uI7Olzt8MTlOt2TFwTS2YVzZGGQAXs8w
	 EwJsAs8QUtbfgTgGIGXeSuDlcmAHtBFPPe2PsiZ0VUHkYHlemJh+a4Z8eWSKzA+TGG
	 LcOZLo6OMBsyxGuiw41t8JiFqpdmArr3FWRCyiN9wi8XbzrxgZ9uTJwtC0StNSCgDk
	 e7UQo6C7QcI0WCG+09SoNmCUPdj5tf5R1usGavHd9SNfpzSS0g7iO15ZZL+ubGzdgX
	 gKu/fqFGlBzrlazxbxayfOEtJEZLoZTNvqQrL7pS7YhjboC23RuI2NBGFoOLHqDyr9
	 YqikGNQ6lwfALBtcGxu533gutk9MrN9Cnq4ZGZF01TTyHXiyuw/3Qz9LecidL8uFcU
	 4uqvBBZTkr5pq1CKcd8k3bJqyzh6Wlrc6ECzzLHgIWcHaCzmWZ3gMfaFJNCw6+XfSg
	 +03Uz3kqz3l1H50gr6CinvME=

systemctlで自動起動を設定し実行します。

% systemctl enable opendkim
% systemctl start opendkim

こちらでOpenDKIMの設定は終了です。

Postfixの設定

ここまでの対応でOpenDKIMが利用できる様になりましたがPostfixとOpenDKIMが現時点で紐づいているわけではないのでその設定をします。

/etc/postfix/main.cfに以下の設定を追記し送信の際にopendkimのプロセスに処理が引き渡されるようにしreloadします。

/etc/postfix/main.cf

...
    smtpd_milters = inet:localhost:8891
    non_smtpd_milters = inet:localhost:8891

non_smtpd_miltersはひとまず設定していますが不要かもしれません。
こちらのオプションはsendmail等のSMTPDを通さない直接の通信に適用される設定らしいのですがSMTPDを通さない通信とは一体...。
(本来あまり理解していない設定を使うべきではないかとは思いますが一旦マニュアルに従い)

メール送信

ここまで設定できればこちらのpostfixを利用してメールを送信すればクライアント側では特に署名を意識することなく自動的に付与されます。

通常の送信と差異はないため割愛しますがいつも通りtelnet localhost 25で生のSMTPで対話して送信しています。

届いたメールを見ると今回指定したamazonses-relayで署名されていることが確認できます。

Received: from e234-12.smtp-out.ap-northeast-1.amazonses.com (e234-12.smtp-out.ap-northeast-1.amazonses.com. [23.251.234.12])
        by mx.google.com with ESMTPS id s62-20020a635e41000000b005c661524f67si5494462pgb.26.2024.02.21.02.27.20
...
Authentication-Results: mx.google.com;
       dkim=pass header.i=@amazonses.com header.s=zh4gjftm6etwoq6afzugpky45synznly header.b=jeD78trO;
       dkim=pass (test mode) header.i=@example.com header.s=amazonses-relay header.b=pTYGTCHC;
       spf=pass (google.com: domain of xxxxxx@ses.example.com designates 23.251.234.12 as permitted sender) smtp.mailfrom=xxxxxx@ses.example.com;
       dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=example.com
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple; s=zh4gjftm6etwoq6afzugpky45synznly; d=amazonses.com; t=1708511240; h=From:To:Subject:Message-Id:Date:Feedback-ID; bh=+qK+xkYRkWOX1w3SSkqyBh1NFCwnIPfFECIp/kKpH+c=; b=jeD78trOySfRZyXLj+cNf+6PX9UAbKDsBY41naUqSt1YuDf+hVHPlxwvbDGtej+b G0e0PDg9rw1WB5JUE+GydJ0641LUF+GgD/fRU3t3m4P+J/6audZk8FVwzgdnLRUvONM xbf0x3rjbaPmgeAimUfS3fr1IJ2BzMV4mrFFXFDA=
DKIM-Filter: OpenDKIM Filter v2.11.0 ip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.internal 893C3C6DE3B
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=example.com; s=amazonses-relay; t=1708511239; bh=+qK+xkYRkWOX1w3SSkqyBh1NFCwnIPfFECIp/kKpH+c=; h=From:To:Subject:From; b=pTYGTCHCIFCkfjNAoMPLl4J/L3fCOs2HKA1L8g2ab+HjQ1pfZ2lAADmOaHZSfb8p/
	 86sDLKid2pLw7cBNDp97Y8g1Oy4Ulg861qDpXc35SyUx/t6ak8XjxMgBGTMFiePq/B
	 s4LW23ETXAd0/URcDMMZBLL+fpMXgRnh1sf49O0dSCq+NWHfYeIi8QbN5ShZI+IZcn
	 hv/qJ+SFbobsOeUj84v9BYY/8rl+ykTA0Y/lTPOn2VczS6eFE/vvBXIMXOCPl5yy+a
	 ks0A1zxvHe08E+mSqlqSe8vgXKXvAMUJKRQ+j25eOJ8z3rSg6yyGH75bTH7c0sUGQO
	 1jbtoW5u9JltqpUocujxSDQXnbNKIYgDgYnabY10Psyyqzc4H3YmKYtZ1EyYUtmX7l
	 p3pYh2Wbn+QiEbm5kptTb4EHz/cT0nArun/8FWERYIqCNNt6QAGW5GH0H/ZMqJD2rQ
	 jMBEu3nFARI88dSejJ1JMEYMRwZo8Lj2UeyHvg3nB+pT3B3ns/qiJbAJJrY1/U0ebc
	 tg7u+grnXj8N/dDdRI9vOqFhPhzV7M6GuSY/H1mWrVK+BKemqvFpkMPnZCZvwuZtc9
	 FdPuyrMu3ve3NN1FamTm2FPrf2zkh8VWmAIs6rAppCR+M2rxjTw45eOr2QkHKACl2M
	 0nGftLE1f8otJ/pfMpBLQ7EA=

Receivedヘッダに書かれている様にこのメールはAmazon SESから送信されていますが、署名した鍵は4096bitのものであり、正規化もsimple/simpleとAmazon SES単体では実現できない方式の署名を用いて送信できていることが確認できます。

手動署名時のAmazon SES側の署名について

上記のメールは確認のためにAmazon SES側のDKIM署名を無効した上で送信を行なっていました。

Every message that you send by using Amazon SES contains a DKIM header that references a signing domain of amazonses.com (that is, it contains the following string: d=amazonses.com). Therefore, if you manually sign your messages, your messages will include two DKIM headers: one for your domain, and the one that Amazon SES automatically creates for amazonses.com.

Amazon SES側のDKIM署名の有無効に限らずamazonses.com側の署名は付与される様ですが、無効にすると当然検証しているIDのドメインを利用した署名はAmazon SES側では行われません。

Amazon SES側の署名を有効にしてメールを送ってみるとどうなるでしょうか。

実際に試してみたところOpenDKIM側で行った署名に加えてAmazon SES側の署名も確認できます(ある意味当然ではありますが)。
これはEasyDKIM・BYODKIMどちらを利用したとしても同様の挙動です。

Authentication-Results: mx.google.com;
       dkim=pass header.i=@example.com header.s=eogp72tvvmnugysm4vjttzghjnmzww36 header.b=oUnETSJK;
       dkim=pass header.i=@amazonses.com header.s=zh4gjftm6etwoq6afzugpky45synznly header.b="SkLS7I/I";
       dkim=pass (test mode) header.i=@example.com header.s=amazonses-relay header.b=GaKZrmfp;
       spf=pass (google.com: domain of xxxxx@ses.example.com designates 23.251.234.12 as permitted sender) smtp.mailfrom=xxxxx@ses.example.com;
       dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=example.com
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple; s=eogp72tvvmnugysm4vjttzghjnmzww36; d=example.com; t=1708512474; h=From:To:Subject:Message-Id:Date; bh=+qK+xkYRkWOX1w3SSkqyBh1NFCwnIPfFECIp/kKpH+c=; b=oUnETSJKX0a7NQitqBBs6SDN4mjPW6qgcHsblAALTNJa9Uw0XV/9H9pNEJGrcCw/ aLVHWqFs2CEhFYklxfH1EJ2KeUKPBi8q0feZB03BOjyZCTyonGAaT8DvlhcKohfpAmX gBk3RHaKc1RiTtdBUMOBHF+G800KrMna0Zfam/I34ak+uzoq6BT+F58eMA5nB1f7Ini Rqs5o8inXz8jcGCCAQDG61X912uB4xtMvvyCEZlQnKp3vig993Skv+gAO0U2dxjL2zh ue93bzG6Bzv/7VOw+Qfs89+kGusval6HhgGbCb98IYHPmtCma5UXEb60WUzFV0bEeUm 3WOYNztH6Q==
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple; s=zh4gjftm6etwoq6afzugpky45synznly; d=amazonses.com; t=1708512474; h=From:To:Subject:Message-Id:Date:Feedback-ID; bh=+qK+xkYRkWOX1w3SSkqyBh1NFCwnIPfFECIp/kKpH+c=; b=SkLS7I/IBs50MplV8d86iUP7dsbYLjIslv5hf8VKVPmFQjjpJ7zXbm4jOF3xmdwx 3TAq6K+wRSpzz5DXwOld/cNG5EO3DzFOSFFWBdmoojitIzFcrPnDMDdllCo1kbtmel8 QMrE0nfVkhk7CtEkle5nJk3lc+1YmMwfRXjR38ZQ=
DKIM-Filter: OpenDKIM Filter v2.11.0 ip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.internal 53996C6DC72
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=example.com; s=amazonses-relay; t=1708512473; bh=+qK+xkYRkWOX1w3SSkqyBh1NFCwnIPfFECIp/kKpH+c=; h=From:To:Subject:From; b=GaKZrmfpEV0GKSoWJ7V2sDi4fv46dl5X86xnLnge13gk2nG51mvtP5BrFjN+q499L
	 JX6W/IoqXFMaHzMsHGFvXxjjWnOrSMUEPKL9rAJa7p89Q+yevJV059n5vKRtHNKdvu
	 crTXMk8ohQI7Tr6wlUTUJ47N4q6H02FSatvK/GYD0iTuM6fqd4DdgGuyw+zq+4iiQt
	 h9TB1YiUABI1PqtT+0fOzye4RJrQ+arsq/MDAaLM9xCrBht744bua2scx5T5pyeued
	 7K9tcx09rRexA8TmH9Pt5gJtTts/cM4ov9Oi7Cx7qQYM7+eq46qhtkwHxyVJ+aT8l1
	 5ldRLhG+lwdqrjt56vhlMGoZsi91/DZsrJH/V2fkYjbriTz+NIoXBkr7YJsu7sxXEr
	 zoPyh8RnTYvuBzHFQbhGoFBXgmVXHTOxRfmOoTyN2bfv4ZEAK09cz3gvxS789nfsqu
	 CgPWdpuh3xi8G+JpEnErQyXVVjn6J9UxMyO0Y30eCOCegzfOp2Z7saQl1736Hsfy6R
	 x9Vu73/dc+sbo3KpnU/GkXMVkXdeg1lNn9bijrhADhVGZ5P6Y7Oe2sR/+mQSc7dOrh
	 MlFgbQqV1Fi3rGwLb90St/AA0OtGAPMh1B3OSy6fjTmO31QEHqlMe9dIGu/8vOWLlk
	 zmBodYalNV0eyYc1HdrdNKBg=

Amazon SESとOpenDKIM側で同じセレクタをを利用しても同様に個別に署名が行われます。

Authentication-Results: mx.google.com;
       dkim=pass (test mode) header.i=@example.com header.s=rotate-before-dkim-key header.b=H0i7px14;
       dkim=pass header.i=@amazonses.com header.s=zh4gjftm6etwoq6afzugpky45synznly header.b=RUBGfA8b;
       dkim=pass (test mode) header.i=@example.com header.s=rotate-before-dkim-key header.b=Gpac3ru1;
       spf=pass (google.com: domain of xxxxx@ses.example.com designates 23.251.234.9 as permitted sender) smtp.mailfrom=xxxxx@ses.example.com;
       dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=example.com
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple; s=rotate-before-dkim-key; d=example.com; t=1708513474; h=From:To:Subject:Message-Id:Date; bh=+qK+xkYRkWOX1w3SSkqyBh1NFCwnIPfFECIp/kKpH+c=; b=H0i7px1479Z+N9JXT4UT9EXgTyjfsC57oTlSAHLFXEJDQ12uR9kNUjMSVt1QZ65w TOeFIoWM9Uk5/X74x3mx4AGMo0DawpR/oqtkK3ZF/fR/da6gAUW2QupokObS9dd8VJC 0cx+d7/oMRWTrbmPz5XnkIXGmMYhiGpExNyp9W0FQdr53yOiXeuVvHRAV5IRT3ephpM phdaJ8KQGYacZG59NSrQfEukdrMA4bogZhPATebaLjEmRVnymTx9e2Ilkm2N+UXEakz GFWEeVvlLG07IP57Hf6n1MX5atsvMH9iZ1D7fBXYgav43aQcM2DCxq0sFP4HrJxQCCf GxcMIePUhQ==
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple; s=zh4gjftm6etwoq6afzugpky45synznly; d=amazonses.com; t=1708513474; h=From:To:Subject:Message-Id:Date:Feedback-ID; bh=+qK+xkYRkWOX1w3SSkqyBh1NFCwnIPfFECIp/kKpH+c=; b=RUBGfA8boUFtxQyiJGwOiMvtWlSEPaMl7E4a/5wy1XxCXqrJyMYNmW7M7T0+5G8w mgJ24EYwneYwXAEqoGmf45HuOhz7dmMMbetVL2hXBqSCJ5jn/KDkY27Z/NrZEcdBAZY aPRqugjYD5hj+vCr20fKnW1sWo65McF9HMLUDPw4=
DKIM-Filter: OpenDKIM Filter v2.11.0 ip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.internal D07DBC6DC72
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=example.com; s=rotate-before-dkim-key; t=1708513474; bh=+qK+xkYRkWOX1w3SSkqyBh1NFCwnIPfFECIp/kKpH+c=; h=From:To:Subject:From; b=Gpac3ru1/Dk79kleixd6wpCzA+bNjVmov/fzVevIymDkRFKLKaPiok2LrtJc/MAcq
	 rzw4eR51DkMnN6Jmd5EEw0avlfMDf0GLMSCfYZ2PfDfFbgLYaC8QgJWAx46cixrhE6
	 9F9mYNfGrEgeQTRSCMqFFhLwHO0B+Vr69lHr+qXqgH6jd9KK6mjPl2oJuByCCMjf8c
	 FXerR2TiXyxCKS1UC7pQi5QiTa+qKV/YKwkjKJLU61NG59lIpCh8/aXnxfC1yX7oiY
	 u43GkcB0ibBDHxEUvtizTXHNg6SekOsv3wt+IdfQed/GytFZhSFzvCCVRAk4vdEiQ1
	 Wizys3VS8G1fQ==

なおAmazon SES側の署名に使うヘッダにはAmazon SES側で付与するものが含まれているため(ex.Message-ID)2つの署名は異なる値を示します。
(この関係でOpenDKIM側の設定を調整しても全く一致は発生されられない)

終わりに

先日の記事に続き独自のキーペアを利用して署名をしつつAmazon SESでメールを送信する方法を試してみました。

DKIM署名を行うといってもEasyDKIMの利用、BYODKIMの利用、Amazon SES側では署名せず(もしくは併用して)独自署名したものをリレーして送信といろいろな方式がとることができ以外とこのあたりの自由度は高いことは実感できます。

とはいえ無条件で自由度を上げられるわけではなく特に今回の様な方式を取る場合は元になるMTAの管理は必要となったりするのでなかなか手が出せないところとはなります。

Amazon SESを使うことを目的としてしまうと必要以上にコストが高くなってしまうこともありますんどえ求められる要件と照らし合わせ十分コストと合うか、Amazon SESに限らず別の選択肢を取る方が好ましいのではないかといった形でいろいろ比較してみてください。