TLS を使用した Postfix 2.6.6 - GMail (および他のいくつかの MTA) からのメールを受信できませんが、他のメールは正常に受信できます。なぜでしょうか?

TLS を使用した Postfix 2.6.6 - GMail (および他のいくつかの MTA) からのメールを受信できませんが、他のメールは正常に受信できます。なぜでしょうか?

Postfix 2.6.6 を実行している CentOS 6 サーバーを調べたところ、すべてのユーザーにメールを送信できるものの、着信 TLS ネゴシエーションの問題により GMail (および他のいくつかの MTA) からのメールを受信できないことがわかりました。

.google.comSMTP サーバー (GMail など)からの接続の結果は次のようになりました。

Aug 23 19:34:29 server1 postfix/smtpd[7659]: connect from mail-lf1-f44.google.com[209.85.167.44]
Aug 23 19:34:29 server1 postfix/smtpd[7659]: setting up TLS connection from mail-lf1-f44.google.com[209.85.167.44]
Aug 23 19:34:29 server1 postfix/smtpd[7659]: SSL_accept error from mail-lf1-f44.google.com[209.85.167.44]: -1
Aug 23 19:34:29 server1 postfix/smtpd[7659]: warning: TLS library problem: 7659:error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher:s3_srvr.c:1387:
Aug 23 19:34:29 server1 postfix/smtpd[7659]: lost connection after STARTTLS from mail-lf1-f44.google.com[209.85.167.44]
Aug 23 19:34:29 server1 postfix/smtpd[7659]: disconnect from mail-lf1-f44.google.com[209.85.167.44]

TLS ログの詳細度を上げる:

Aug 23 21:56:15 server1 postfix/smtpd[18103]: initializing the server-side TLS engine
Aug 23 21:56:15 server1 postfix/smtpd[18103]: connect from mail-lf1-f47.google.com[209.85.167.47]
Aug 23 21:56:15 server1 postfix/smtpd[18103]: setting up TLS connection from mail-lf1-f47.google.com[209.85.167.47]
Aug 23 21:56:15 server1 postfix/smtpd[18103]: mail-lf1-f47.google.com[209.85.167.47]: TLS cipher list "ALL:+RC4:@STRENGTH:!aNULL:!LOW:!EXP:!MEDIUM:!ADH:!AECDH:!MD5:!DSS:!ECDSA:!CAMELLIA128:!3DES:!CAMELLIA256:!RSA+AES:!eNULL"
Aug 23 21:56:15 server1 postfix/smtpd[18103]: SSL_accept:before/accept initialization
Aug 23 21:56:15 server1 postfix/smtpd[18103]: SSL3 alert write:fatal:handshake failure
Aug 23 21:56:15 server1 postfix/smtpd[18103]: SSL_accept:error in SSLv3 read client hello C
Aug 23 21:56:15 server1 postfix/smtpd[18103]: SSL_accept error from mail-lf1-f47.google.com[209.85.167.47]: -1
Aug 23 21:56:15 server1 postfix/smtpd[18103]: warning: TLS library problem: 18103:error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher:s3_srvr.c:1387:
Aug 23 21:56:15 server1 postfix/smtpd[18103]: lost connection after STARTTLS from mail-lf1-f47.google.com[209.85.167.47]
Aug 23 21:56:15 server1 postfix/smtpd[18103]: disconnect from mail-lf1-f47.google.com[209.85.167.47]

共有暗号がない?

TLS は (自己署名された) サーバー証明書ですでに有効になっており、クライアントは SASL を使用した IMAP/POP 経由でメールを送受信するために正常に接続していました。

postfix エラーの一般的な原因について調べてみました1408A0C1が、どれもこのシナリオに当てはまるようには思えませんでした。実行したチェックのいくつかは、予想と矛盾する結果を生み出しました。

postconf -d | grep cipherlist除外リストはかなり短いものでした:

tls_export_cipherlist = ALL:+RC4:@STRENGTH
tls_high_cipherlist = ALL:!EXPORT:!LOW:!MEDIUM:+RC4:@STRENGTH
tls_low_cipherlist = ALL:!EXPORT:+RC4:@STRENGTH
tls_medium_cipherlist = ALL:!EXPORT:!LOW:+RC4:@STRENGTH
tls_null_cipherlist = eNULL:!aNULL

TLS プロトコルはかなり寛容でした。

smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtp_tls_mandatory_protocols  = !SSLv2, !SSLv3
smtpd_tls_protocols           = !SSLv2, !SSLv3
smtp_tls_protocols            = !SSLv2, !SSLv3

では、なぜ暗号をネゴシエートできなかったのでしょうか?

私はまずOpenSSL(OpenSSL 1.0.1e-fips 11 Feb 2013で入手可能な最新のyum)を更新し始めました。この記事の指示に従ってそして結果的にボックスが実行されますOpenSSL 1.0.2p 14 Aug 2018

しかし、GMail の受信問題は依然として続いていました...

あらゆる TLS バリアントが成功する可能性を与えるために、それらをそのままにして、暗号をより詳細に研究しました。

無効化全て暗号の除外を解除して、Gmail からテストメールを送信したところ、予想どおりに届きました。

Aug 23 23:39:52 server1 postfix/smtpd[6036]: connect from mail-lj1-f171.google.com[209.85.208.171]
Aug 23 23:39:52 server1 postfix/smtpd[6036]: setting up TLS connection from mail-lj1-f171.google.com[209.85.208.171]
Aug 23 23:39:52 server1 postfix/smtpd[6036]: mail-lj1-f171.google.com[209.85.208.171]: TLS cipher list "ALL:+RC4:@STRENGTH"
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:before/accept initialization
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 read client hello B
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write server hello A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write certificate A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write server done A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 flush data
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 read client key exchange A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 read finished A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write session ticket A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write change cipher spec A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write finished A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 flush data
Aug 23 23:39:52 server1 postfix/smtpd[6036]: Anonymous TLS connection established from mail-lj1-f171.google.com[209.85.208.171]: TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)
Aug 23 23:39:52 server1 postfix/smtpd[6036]: 66BB15DC6: client=mail-lj1-f171.google.com[209.85.208.171]
Aug 23 23:39:52 server1 postfix/cleanup[6424]: 66BB15DC6: message-id=<CAK9Gk9r+6gt7g_U987A0XaGdKJGY=80n0rK595mqrmfGaL5LKQ@mail.gmail.com>
Aug 23 23:39:52 server1 opendkim[6890]: 66BB15DC6: mail-lj1-f171.google.com [209.85.208.171] not internal
Aug 23 23:39:52 server1 opendkim[6890]: 66BB15DC6: not authenticated
Aug 23 23:39:52 server1 opendkim[6890]: 66BB15DC6: DKIM verification successful
Aug 23 23:39:52 server1 postfix/qmgr[6032]: 66BB15DC6: from=<gmailaddress>, size=3988, nrcpt=1 (queue active)
Aug 23 23:39:52 server1 postfix/smtpd[6036]: disconnect from mail-lj1-f171.google.com[209.85.208.171]
Aug 23 23:39:52 server1 postfix/pipe[6425]: 66BB15DC6: to=<myinbox>, relay=dovecot, delay=0.48, delays=0.29/0.01/0/0.18, dsn=2.0.0, status=sent (delivered via dovecot service)

では、GMail がAES128-GCM-SHA256TLSv1.2 経由でネゴシエートしていたのなら、なぜ以前は機能していなかったのでしょうか? 特に、暗号リストには、最後に RC4 が強度順に並べられた、一致する可能性のあるものがすべて含まれているように見えるのですが?


テストするために、特定の暗号リストを取得し、AES128 ハッシュ深度 (イタリック体) - ECDHE および DHE メソッド - を先頭に追加し、それを postfix で明示的に宣言したところ、うまくいきました。

tls_high_cipherlist=ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA

ただし、暗号リストのレシピを常に更新する必要はなかったので、tls_high_cipherlist宣言をコメントアウトしました。

それから私はいくつかのことをしました。

postfix では、推奨に従って smtpd セクションにmaster.cf追加しました。-o smtp_tls_mandatory_protocols=TLSv1

私は、以下の宣言を使用してTLSプロトコルを改善したいと考えました。https://blog.kruyt.org/postfix-and-tls-encryption/は、TLSv1.2 と TLSv1.1 を明示的に承認してから、古いバージョンを除外します。ただし、postfix 2.6.6 ではこれは機能しません。リロード/再起動後すぐに、ログに次の内容が表示されました。

warning: Invalid TLS protocol list "TLSv1.2, TLSv1.1, !TLSv1, !SSLv2, !SSLv3": disabling TLS support

これは、除外ルールと包含ルールを混在させた場合に発生したため、明示的な除外形式に戻しました。

smtpd_tls_protocols = !TLSv1, !SSLv2, !SSLv3
smtp_tls_protocols = !TLSv1, !SSLv2, !SSLv3
smtp_tls_ciphers = high
smtpd_tls_ciphers = high
smtpd_tls_mandatory_protocols = !TLSv1, !SSLv2, !SSLv3
smtp_tls_mandatory_protocols = !TLSv1, !SSLv2, !SSLv3
smtp_tls_mandatory_ciphers = high
smtpd_tls_mandatory_ciphers = high

そしてこれは postfix によって受け入れられました。

私は日和見TLSを設定しました

smtp_tls_security_level = may
smtpd_tls_security_level = may

GMail の配信問題を解決した後でも、他のいくつかの MTA がまだ失敗していることに気付きました。

server1 postfix/smtpd[28167]: connect from mta3.email.secretescapes.com[198.245.84.110]
server1 postfix/smtpd[28167]: setting up TLS connection from mta3.email.secretescapes.com[198.245.84.110]
server1 postfix/smtpd[28167]: mta3.email.secretescapes.com[198.245.84.110]: TLS cipher list "ALL:!EXPORT:!LOW:!MEDIUM:+RC4:@STRENGTH:!MD5:!DES:!ADH:!RC4:!PSD:!SRP:!3DES:!eNULL:!aNULL"
server1 postfix/smtpd[28167]: SSL_accept:before/accept initialization
server1 postfix/smtpd[28167]: SSL_accept:error in SSLv2/v3 read client hello A
server1 postfix/smtpd[28167]: SSL_accept error from mta3.email.secretescapes.com[198.245.84.110]: -1
server1 postfix/smtpd[28167]: warning: TLS library problem: 28167:error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol:s23_srvr.c:647:
server1 postfix/smtpd[28167]: lost connection after STARTTLS from mta3.email.secretescapes.com[198.245.84.110]
server1 postfix/smtpd[28167]: disconnect from mta3.email.secretescapes.com[198.245.84.110]

-

server1 postfix/smtpd[1451]: initializing the server-side TLS engine
server1 postfix/smtpd[1451]: connect from mta.email.bbc.com[198.245.84.99]
server1 postfix/smtpd[1451]: setting up TLS connection from mta.email.bbc.com[198.245.84.99]
server1 postfix/smtpd[1451]: mta.email.bbc.com[198.245.84.99]: TLS cipher list "ALL:!EXPORT:!LOW:!MEDIUM:+RC4:@STRENGTH:!MD5:!aDSS:!kECDH:!kDH:!SEED:!IDEA:!DES:!ADH:!RC2:!RC4:!RC5:!PSD:!SRP:!3DES:!eNULL:!aNULL"
server1 postfix/smtpd[1451]: SSL_accept:before/accept initialization
server1 postfix/smtpd[1451]: SSL_accept:error in SSLv2/v3 read client hello A
server1 postfix/smtpd[1451]: SSL_accept error from mta.email.bbc.com[198.245.84.99]: -1
server1 postfix/smtpd[1451]: warning: TLS library problem: 1451:error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol:s23_srvr.c:647:
server1 postfix/smtpd[1451]: lost connection after STARTTLS from mta.email.bbc.com[198.245.84.99]
server1 postfix/smtpd[1451]: disconnect from mta.email.bbc.com[198.245.84.99]
server1 postfix/smtpd[1451]: connect from unknown[107.174.30.57]
server1 postfix/smtpd[1451]: 4F6D0629C: client=unknown[107.174.30.57]

その後、tls_high_cipherlistのいくつかの順列を試し、最終的にbettercrypto.org の推奨リスト:

tls_high_cipherlist=EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA

サーバーは、以下のさまざまなSSLテスターでテストされています。TLS チェック(100%の結果)、ルクシ(A+の結果)、htbridge の SSL テスター(良い成績)とSSL ツール

発信接続をポリシー マップできることは承知していますが、特定の MTA (見つかった場合) の除外を選択的に無効にし、ネゴシエートしている暗号を調べて、提示する暗号リストを調整できる同等のものを探しています。

現在の postfix TLS 構成に、特に明らかな欠陥は見当たりません。他の MTA は問題なく TLS 暗号をネゴシエートできるのに、なぜ特定の MTA はネゴシエートできないのか、私には理解できません。うるさい GMail でも、今は大丈夫です。

何か案は?:-)


私はメモを取ったGoogleがなぜこの暗号を好むのかというSEの質問、とても興味深い読み物でした。

提供元このPostfixユーザーフォーラムスレッド、利用可能なすべての暗号で TLS 接続がいくつ成功したかをすばやく確認するための便利なレシピを見つけました。

egrep "TLS connection established from.*with cipher" /var/log/maillog* | awk '{printf("%s %s %s %s\n", $12, $13, $14, $15)}' | sort | uniq -c | sort -

答え1

結局のところ、この問題は、一部の送信者がまだ SSLv3 のみをネゴシエートできることが原因であるようです。これは悪いことですが、電子メールを受信できないのも良くありません。

それは本当に単純なことです。私はこれに満足していませんが、送信側の MTA が TLS への再ネゴシエーションを拒否し、SSLv3 で永遠に再試行するだけであれば、現時点で私たちにできることはあまりありません。

そのため、当面は、受信メールを SSLv3 で暗号化することを許可しながらも、サーバー上のすべてのクライアントが TLS 経由で認証する必要があるようにすることにしました。

私は、以下のプロトコル否定子を緩和することでこれを達成しましたmain.cf

smtpd_tls_mandatory_protocols = !TLSv1, !SSLv2
smtpd_tls_protocols = !TLSv1, !SSLv2

注意: これらのsmtp_tls_定義は、このサーバーから送信されるメールに関するものであり、クライアント接続に関係するため、必要に応じて厳密にすることができます (電子メール クライアントの設定方法を全員に説明する意思がある限り)。

smtp_tls_mandatory_protocols = !TLSv1, !SSLv2, !SSLv3
smtp_tls_protocols = !TLSv1, !SSLv2, !SSLv3

送信側 MTA が TLS をネゴシエートできず、SSLv3 を期待している場合、通常、メールログには次の内容が表示されます。

warning: TLS library problem: 364:error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol:s23_srvr.c:647:

ログレベルを上げると、TLSネゴシエーションが失敗し、次のようなメッセージが表示されるようになります。

postfix/smtpd[26234]: SSL_accept:before/accept initialization
postfix/smtpd[26234]: SSL_accept:error in SSLv2/v3 read client hello A
postfix/smtpd[26234]: SSL_accept error from 201-62-89-201.life.com.br[201.62.89.201]: -1

私は定期的に SSLv3 接続を禁止するテストを行ってきました (必然的に MTA は何日も再試行します)。そのため、ログにいくつかの失敗が蓄積されてから分析することができます。

この bash スクリプトは、どのサーバーが SSLv3 を使用しようとしているかを分析するのに役立ちます。

#!/bin/sh
egrep "SSL_accept error" /var/log/maillog | awk '{printf("%s %s %s\n", $9, $10, $11)}' | sort | uniq -c | sort -`

このバリエーションはネゴシエートされた暗号を示しています。したがって、SSLv3 を再度有効にしたら、しばらくそのままにして、MTA が SSLv3 を使用していることを確認できます。

#!/bin/sh
egrep "TLS connection established from.*with cipher" /var/log/maillog | awk '{printf("%s %s %s %s\n", $12, $13, $14, $15)}' | sort | uniq -c | sort -

より良い答えはまだ見つかっていません。より微妙なアプローチを取り、接続試行が特定のエラーで失敗するかどうかに応じて、特定の MTA に対して SSLv3 を選択的に許可できるようにしたいと思いますmaillog。すべてのコメント/提案を歓迎します。

関連情報