aikawa

Google Domainsを使ってDANEを設定する

前回と前前回MTA-STSを設定したので、今回はDANEを設定してみます。

ドメイン取得はDNSサーバを提供していて、最初からDNSSECが設定されているGoogle Domainsを使います(DNSSEC分からなくても、何もしなくて良いのは助かります)。
※提供しているDNSサーバによってはTLSAレコードを設定出来なかったりするので、他で取得する時は事前に確認が必要です。
※タイムリーな事にGoogle Domainsやめるってよ、な話が出てて、移行先でもDNSSECが最初から有効かは、分かりません。








TLS証明書は、前前回のLet’s Encryptを使い回します。いつものようにexample.comを使います。

TLSAレコード作成(danetool)

TLSAレコードの作成には、opensslを使ったやり方が幾つも見つかるのですが、

  • 殆どがopenssl 0.9のやり方で書いてあって、違う値を出力していた(これは後で分かった)
  • CertUsage, Selector, MatchingTypeによって書き方が何通りも有り、ミスに気を使う

といった点で(特に一番目の理由が最初分からず)一旦挫折したのですが、色々と調べた結果それを含めた面倒を見てくれるdanetoolが有ったのでそれで解決します。

dnf install gnutls-utils
danetool --tlsa-rr --host example.com --load-certificate /etc/letsencrypt/live/example.com/cert.pem --starttls-proto=smtp

_25._tcp.example.com. IN TLSA ( 03 01 01 [hash値]) のように出力がされるのでTLSAレコードには、
03 01 01 [hash値]を3 1 1 [hash値]に修正して入れます。
またstarttls-proto=httpsにすると、_25._tcpが_443._tcpにだけ変わりますが、他のオプションを変えなければhash値等は変わらないので、確認をする意味以外では出力する必要は有りません。

Google Domains

取得したドメインに、先ほど生成したTLSAレコードを設定します。DNS>カスタムレコードの管理で編集画面を出し、以下のように設定します。

  • サブドメイン _25._tcp と、ついでにWeb用に_443._tcpも追加する
  • TLSAを選択
  • TTLは失敗を考慮して短めに設定
  • 先ほど生成したTLSAレコード値を入力

最後に保存を押して、レコードが追加されるのを確認します。
ついでに下の方でDNSSECが有効になっているのを確認しておきます。

Postfix

サーバ側(smtpd)は前々回やったLet’s Encryptを使ったTLSの設定をしておけば、特に何もしなくてもVerifyは通ります。
SMTPクライアント (smtpd_でなくsmtp_) は試していないので、追加設定が必要になるかも知れません。

確認

確認もdanetoolで出来ます。

danetool --check example.com --proto tcp --starttls-proto=smtp --load-certificate /etc/letsencrypt/live/example.com/cert.pem

TLSAレコードが出力され、最後にVerification: Certificate matches.が出ればOKです。



Webについてもhttps接続が正常に出来ればOKになる筈です。

その他色々

Let’s Encrypt

短い間に更新をするLet’s Encryptでは、TLSAレコードで、3 0 1, 3 0 2のようにSelector=0(FullCertificate) を避けるように言っています。

https://community.letsencrypt.org/t/please-avoid-3-0-1-and-3-0-2-dane-tlsa-records-with-le-certificates/7022

また証明書の更新でpubkeyが変わり、TLSAレコードが無効になってしまうのに対して/etc/letsencrypt/cli.iniに reuse-key = true を入れる案が出ています。

https://community.letsencrypt.org/t/tlsa-record-changes-with-every-renewal-process-which-breaks-dane/144145/4

Postfix


Postfixでは、CertUsageの01は不可、2はオプションで、3を推奨しているようです。



PostfixとLet’s Encryptの事情を考慮すると、TLSAには、3 1 1 を使うのが良いようです。

Openssl

TLSA作成用に書いてあるオプションがopenssl 0.9用になっていて通らなかった件ですが、Webで幾ら探しても分からず、postfixのパッケージに含まれていたTLS_READMEに書いてあったのを偶然見つけて漸く分かりました。



そんなわけでopensslでTLSAが 3 1 1の場合、以下のようにすればdanetoolと同じhash値を出しました。

openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -pubkey -noout | openssl pkey -pubin -outform der | sha256sum

Selector=0の場合はまた違いますので、注意が必要です。