web-dev-qa-db-ja.com

nginxエラーログ:「SSL_BYTES_TO_CIPHER_LIST:inappropriate fallback」

最近、nginx設定を変更して、TLSv1.2とより多くのより安全な暗号をサポートします。変更以降、nginxエラーログには次のエラーが記録されます。

2015/01/28 23:55:57 [crit] 16898#0:* 18712916 SSL_do_handshake()が失敗しました(SSL:エラー:140A1175:SSLルーチン:SSL_BYTES_TO_CIPHER_LIST:不適切なフォールバック)、SSLハンドシェイク、クライアント:、サーバー:0.0.0.0:443

Nginxの設定は次のとおりです。

server {
  root   /var/www/fl/current/public;

  listen              443;
  ssl                 on;
  ssl_certificate     /etc/nginx/ssl/wildcard.pem;
  ssl_certificate_key /etc/nginx/ssl/wildcard.key;
  ssl_session_timeout 5m;
  ssl_session_cache shared:SSL:50m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers '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:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
  ssl_prefer_server_ciphers on;

ユーザーがサイトにアクセスできないことについてのメールをいくつか受け取りました。あるユーザーは、これはFirefoxで発生するエラーだと述べています。

安全な接続に失敗しました

******。comへの接続中にエラーが発生しました。クライアントがサーバーがサポートするよりも低いバージョンのTLSにダウングレードしたため、サーバーはハンドシェイクを拒否しました。 (エラーコード:ssl_error_inappropriate_fallback_alert)

受信したデータの正当性を確認できなかったため、表示しようとしているページを表示できません。

私が正しく理解していれば、クライアントとサーバーがサポートしているバージョンよりも低いバージョンのTLSをクライアントが使用している場合、フォールバックアラートはセキュリティ対策になります。このエラーは、より高いプロトコルバージョンをサポートしていることを考えると、大いに意味があるようです。私が理解していないのは、この変更が私たちのサイトに接続するときに一部のユーザーに問題を引き起こす理由です。これは私たちの設定またはそのブラウザの欠陥ですか?

Qualys SSL Server Testで「A」のスコアを付けたので、以前の設定に戻すのをためらっています。

6
EricR

ブラウザは通常、SSLv23ハンドシェイクを行います。このハンドシェイクにより、彼らはサポートする最高のプロトコルバージョン(主に今日のTLS1.2)を発表しますが、サーバーをこのバージョンに制限しません。したがって、適切に実装および構成されたTLSスタックを備えているが、TLS1.0のみをサポートするサーバーは、単にTLS1.0で応答し、最初の試行で接続が成功します。

ただし、サーバー側にいくつかの不良なTLSスタックまたは構成ミス、またはいくつかの不良なミドルボックス(ロードバランサーなど)があり、このSSLv23ハンドシェイクが失敗します。この場合、ブラウザはハンドシェイクで使用されるプロトコルをダウングレードします。つまり、明示的なTLS1.0ハンドシェイクに続いて明示的なSSL3.0ハンドシェイクを試みます(一部のブラウザはすでにSSL3.0を無効にしているため、これを試みません)。

新しいブラウザーは、ダウングレードされた接続を行う場合、TLS_FALLBACK_SCSV疑似暗号を使用します。 TLS_FALLBACK_SCSVに対応するサーバーが、サポートするプロトコルバージョンが低いダウングレードされた接続を検出した場合(ダウングレードはTLS1.0を使用しますが、サーバーはTLS1.2をサポートします)、POODLEのような攻撃が発生したと想定して接続を閉じます。

しかし、サーバーに接続するときに、クライアントがそもそもなぜダウングレードするのでしょうか。

  • フロントでロードバランサーが壊れている可能性があります。これにより、一部のリクエストで障害が発生します。
  • SSLハンドシェイクが完了する前に、サーバーまたは何らかの抗DOSデバイスが高負荷で接続を単に閉じる可能性があります。この場合、ブラウザはプロトコルの問題を想定し、ダウングレードしたバージョンで再試行します。
  • メモリ不足など、SSLハンドシェイク内でランダムなクローズを引き起こす可能性のあるその他の種類の問題。
12
Steffen Ullrich

変更318904に関連するパッチセットがアップロードされました(BBlackによる):クライアントハンドシェイクの非クリティカルSSL_R_VERSION_TOO_LOW

https://gerrit.wikimedia.org/r/318904

https://phabricator.wikimedia.org/T14889

0
afly