Postfix の smtpd_tls_wrappermode とは？


質問です。  
Postfix の smtpd_tls_wrappermode の意味をご存知でしょうか？

ドキュメント(後述)を読むと、ポート 465 による SMTPS と smtpd_tls_wrappermode は  
関係ないように読めるのですが、違うのでしょうか？

# やりたいこと

Postfix でポート 465 を使った SMTPS を設定したい。

RFC8414 でいう「submission」です(STARTTLS ではないほうの SMTPS です)  
<https://www.rfc-editor.org/rfc/rfc8314>

結局 STARTTLS による SMTPS も、submission による SMTPS もできたのですが、  
smtpd_tls_wrappermode の意味が分からないのです。

# わかっていること

つまり「smtpd_tls_wrappermode は Outlook 専用の設定である」と理解しています。

以下の文書を読みました。  
<http://www.postfix.org/TLS_README.html>  
<http://www.postfix.org/postconf.5.html#smtpd_tls_wrappermode>

TLS_README にはこう書いてあります。

> TLS is sometimes used in the non-standard "wrapper" mode where a server
> always uses TLS,  
>  instead of announcing STARTTLS support and waiting for remote SMTP clients
> to request TLS service.  
>  Some clients, namely Outlook [Express] prefer the "wrapper" mode.  
>  This is true for OE (Win32 < 5.0 and Win32 >=5.0 when run on a port<>25 and
> OE (5.01 Mac on all ports).

postconf.5 にはこう書いてあります。

> smtpd_tls_wrappermode (default: no)  
>  Run the Postfix SMTP server in the non-standard "wrapper" mode, instead of
> using the STARTTLS command.  
>  If you want to support this service, enable a special port in master.cf,  
>  and specify "-o smtpd_tls_wrappermode=yes" on the SMTP server's command
> line.  
>  Port 465 (smtps) was once chosen for this purpose.

# 環境

## クライアント

[code]

    % uname -rsm
    Linux 4.17.3-1-ARCH x86_64
    
[/code]

・msmtp 1.6.7

・~/.msmtprc の内容

[code]

    defaults
    logfile         ~/.msmtp.log
    account         test
    host            192.168.1.24
    port            25
    from            miwa@example.jp
    user            miwa@example.jp
    password        password
    account default : test
    
[/code]

## SMTP サーバー

[code]

    # uname -rsm
    Linux 3.10.0-862.3.2.el7.x86_64 x86_64
    
[/code]

・Postfix 2.10.1

・/etc/postfix/master.cf の内容

[code]

    smtp      inet  n       -       n       -       -       smtpd  -v
    smtps     inet  n       -       n       -       -       smtpd  -v
      -o smtpd_tls_wrappermode=yes
    
[/code]

・postconf -n の内容

[code]

    alias_database = hash:/etc/aliases
    alias_maps = hash:/etc/aliases
    broken_sasl_auth_clients = yes
    command_directory = /usr/sbin
    config_directory = /etc/postfix
    daemon_directory = /usr/libexec/postfix
    data_directory = /var/lib/postfix
    debug_peer_level = 2
    debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5
    home_mailbox = Maildir/
    html_directory = no
    inet_interfaces = 192.168.1.24
    inet_protocols = all
    mail_owner = postfix
    mailbox_size_limit = 409600000000
    mailq_path = /usr/bin/mailq.postfix
    manpage_directory = /usr/share/man
    message_size_limit = 5120000000
    mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
    mydomain = example.jp
    myhostname = smtp.example.jp
    myorigin = $mydomain
    newaliases_path = /usr/bin/newaliases.postfix
    queue_directory = /var/spool/postfix
    readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES
    sample_directory = /usr/share/doc/postfix-2.10.1/samples
    sendmail_path = /usr/sbin/sendmail.postfix
    setgid_group = postdrop
    smtpd_recipient_restrictions = permit_sasl_authenticated, reject
    smtpd_sasl_auth_enable = yes
    smtpd_sasl_local_domain = $mydomain
    smtpd_sasl_security_options = noanonymous
    smtpd_tls_cert_file = /etc/ssl/example.jp/server.crt
    smtpd_tls_key_file = /etc/ssl/example.jp/private/server.key.no
    smtpd_tls_loglevel = 3
    smtpd_tls_security_level = may
    unknown_local_recipient_reject_code = 550
    
[/code]

# ためしたこと

submission(ポート 465 の SMTPS)をやりたい。

master.cf の -o smtpd_tls_wrappermode=yes をコメントアウトした場合。エラーになる。

[code]

    % echo `date` | msmtp --account=test --auth=plain  miwa@example.jp --tls=on --tls-starttls=off --tls-certcheck=off --port=465
    msmtp: TLS handshake failed: An unexpected TLS packet was received.
    msmtp: could not send mail (account test from /home/miwa/.msmtprc)
    
[/code]

master.cf の -o smtpd_tls_wrappermode=yes をコメントを外した場合。メール送信できる。

[code]

    % echo `date` | msmtp --account=test --auth=plain  miwa@example.jp --tls=on --tls-starttls=off --tls-certcheck=off --port=465
    
[/code]

宛先にメール受信できることを確認した。  
パケットキャプチャして、TCP 3wayハンドシェイクのあとに TLS ハンドシェイクしたことを確認した。

# わからないこと

「the non-standard "wrapper" mode」と言っている「標準」とは RFC のことでしょうか？また、「ラッパー」とはなんでしょうか？

smtpd_tls_wrappermode は Outlook 専用の設定である、と理解したのですが、じつは submission(ポート 465 での
SMTPS)をするときは必須なのでしょうか？




> 「the non-standard "wrapper" mode」と言っている「標準」とは RFC のことでしょうか？

「標準」=「STARTTLS の SSL/TLS」  
「標準じゃない」=「STARTTLS じゃない(古い) SSL/TLS」

ということだと思います。

> また、「ラッパー」とはなんでしょうか？

`smtpd_tls_wrappermode=yes` の場合、最初の接続から SSL/TLS ハンドシェイクになるので、SMTP を SSL/TLS
でラップするということかもしれません。

> smtpd_tls_wrappermode は Outlook 専用の設定である、と理解したのですが、じつは submission(ポート 465 での
> SMTPS)をするときは必須なのでしょうか？

必須です。

