OpenBSD を 6.8 から 6.9 にアップグレード後 smptd でメール送信できなくなった際のデバグメモ。

原因はTLSのデフォルト設定が変更になったため。相手側の SMTP サーバと設定をあわせることでメールが送信できる状態に回復した。

エラーログ

ログファイル /var/log/maillog に次のような handshake 失敗が記録される。ユーザ認証前の接続に失敗する。これは TLS の handshake に失敗している。

1
2
  mta connected
  mta error reason=IO Error: handshake failed: unexpected EOF

原因はサーバ、クライアントがTLS で使用する ciphers の不一致。これが一致するように smptd を設定すればよい。

smptd.conf 該当箇所

設定ファイル smtpd.conf(5) の action を指定するところ。

1
2
action "outbound" relay host smtps://[email protected]:465 \
        auth <secrets> mail-from [email protected]

ここに次のように TLS で使用する ciphers を指定する。これで TLS の handshake が完了しメールが送信できるようになった。

1
2
3
  action "outbound" relay host smtps://[email protected]:465 \
          auth <secrets> mail-from [email protected] \
          ciphers "comapt" # Added

なお、指定可能な値は tls_config_set_ciphers(3) に記載がある。例えば次が指定可能(これ以外にも SSL_CTX_set_cipher_list(3) の形式で指定できる)。

  • secure (default)
  • compat
  • legacy
  • insecure

他のサーバからの SMTP をリッスンしており、そこでも cipher を標準から変更する場合は listen で ciphers を指定する。

TLS cipher について

設定値 secure, compat, legacy, insecure で具体的に使用可能になる ciphers は man page には明示されていない。しかし、対応する ciphers の format がソースコードに記載してある。

https://github.com/libressl-portable/openbsd/blob/cb4e3c87ce46cd3cd2b08c4f40b85f7a6be7f50a/src/lib/libtls/tls_internal.h#L35

1
2
3
4
  #define TLS_CIPHERS_DEFAULT	"TLSv1.3:TLSv1.2+AEAD+ECDHE:TLSv1.2+AEAD+DHE"
  #define TLS_CIPHERS_COMPAT	"HIGH:!aNULL"
  #define TLS_CIPHERS_LEGACY	"HIGH:MEDIUM:!aNULL"
  #define TLS_CIPHERS_ALL		"ALL:!aNULL:!eNULL"

標準では TLS 1.3 もしくは TLS 1.2 のうち前方秘匿性(ECDHEかDHE)かつAEAD(暗号化と認証を同時に実行する)のみが許可されていることが分かる。

このキーワードを openssl ciphers のコマンドで指定することで具体的な ciphers の リストを得られる。たとえば comapt に対応する ciphers は次のように確認できる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
  > openssl ciphers -v HIGH:!aNULL
  AEAD-AES256-GCM-SHA384  TLSv1.3 Kx=TLSv1.3  Au=TLSv1.3 Enc=AESGCM(256) Mac=AEAD
  AEAD-CHACHA20-POLY1305-SHA256 TLSv1.3 Kx=TLSv1.3  Au=TLSv1.3 Enc=ChaCha20-Poly1305 Mac=AEAD
  AEAD-AES128-GCM-SHA256  TLSv1.3 Kx=TLSv1.3  Au=TLSv1.3 Enc=AESGCM(128) Mac=AEAD
  # ... snip ...
  AES128-GCM-SHA256       TLSv1.2 Kx=RSA      Au=RSA  Enc=AESGCM(128) Mac=AEAD
  AES128-SHA256           TLSv1.2 Kx=RSA      Au=RSA  Enc=AES(128)  Mac=SHA256
  AES128-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(128)  Mac=SHA1
  CAMELLIA128-SHA256      TLSv1.2 Kx=RSA      Au=RSA  Enc=Camellia(128) Mac=SHA256
  CAMELLIA128-SHA         SSLv3 Kx=RSA      Au=RSA  Enc=Camellia(128) Mac=SHA1

SMTPサーバが使用する cipher の確認

コマンド openssl を使い実際に接続することで使用する cipher を確認できる。

1
2
3
4
5
6
  > openssl s_client -connect smtp.example.org:465
  # ... snip ...
  SSL-Session:
      Protocol  : TLSv1.2
      Cipher    : AES128-GCM-SHA256
  # ... snip ...

この例では AES128-GCM-SHA256 が使用されている。これは鍵交換に RSA を利用しており前方秘匿性がないためデフォルト設定だと接続できなかった。

環境

  • OpenBSD 6.9
  • OpenSMTPD 6.9.0
  • LibreSSL 3.3.2