OpenDKIMで署名したメールをAmazon SES経由で送信してみました
初めに
先日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します。
... 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に限らず別の選択肢を取る方が好ましいのではないかといった形でいろいろ比較してみてください。