web-dev-qa-db-ja.com

エラーが発生します:SSL3_GET_RECORD:復号化に失敗したか、不正なレコードMAC

私は自分のサーバーを持っています(ここでApache/2.4.27を実行しています)。今日、私は(ブレイブとグーグルChrome-別のコンピューター)から、ウェブサイトからエラー;

This site can’t provide a secure connection

mywebsite.com sent an invalid response.
ERR_SSL_PROTOCOL_ERROR

そして奇妙なことに、私のウェブサイトで5回クリックするたびにこのエラーが発生します。

私のconfファイルから:

SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/mywebsite/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mywebsite/privkey.pem
Include /etc/letsencrypt/options-ssl-Apache.conf
SSLCertificateChainFile /etc/letsencrypt/live/mywebsite/chain.pem
SSLCompression off

options-ssl-Apache.confから

SSLProtocol             all -SSLv2 -SSLv3
SSLCipherSuite          EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLHonorCipherOrder     on
SSLCompression          off

私はウェブサイトからログファイルをチェックしましたが、何もここにもありません。 /var/log/Apache2/error.log

私はこのエラーの原因を突き止めようとしています、この問題を解決するにはどうすればよいですか?

編集:

openssl s_client -connect mywebsite.com:443を試してみると、以下が返されます。

私が使用しています:OpenSSL 1.1.0f

CONNECTED(00000003)

...

3073276480:error:1408F119:SSL routines:ssl3_get_record:decryption failed or bad record mac:../ssl/record/ssl3_record.c:469:

別の編集:

@quadruplebuckyが示唆したように、options-ssl-Apache.confを次のように変更しました。

SSLProtocol             all -SSLv2 -SSLv3
SSLCipherSuite           HIGH:MEDIUM:!aNULL:!MD5:!SSLv3:!SSLv2:!TLSv1
SSLHonorCipherOrder     on
SSLCompression          off

#SSLSessionTickets       off

私はvirtualhost confファイルにSSLProtocol all -SSLv2 -SSLv3を追加することも試みましたが、同時にここでいくつかの変更を行いました。 /etc/Apache2/mods-available/ssl.conf

#SSLCipherSuite HIGH:!aNULL
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SSLv3:!SSLv2:!TLSv1

SSLHonorCipherOrder on

#   The protocols to enable.
#   Available values: all, SSLv3, TLSv1, TLSv1.1, TLSv1.2
#   SSL v2  is no longer supported
SSLProtocol all -SSLv2 -SSLv3

編集:

LogLevelをInfoに変更すると、次が返されます。

[Sat Jul 08 13:34:53.374307 2017] [ssl:info] [pid 8710] [client] AH02008: SSL library error 1 in handshake (server mywebsite:443)
[Sat Jul 08 13:34:53.374717 2017] [ssl:info] [pid 8710] SSL Library Error: error:140940F4:SSL routines:ssl3_read_bytes:unexpected message
[Sat Jul 08 13:34:53.374750 2017] [ssl:info] [pid 8710] [client] AH01998: Connection closed to child 1 with abortive shutdown (server mywebsite:443)

編集:

オプション-crlfで実行すると、次のようになります。

openssl s_client -crlf -connect mywebsite:443

エラーは発生していませんか?

もう1つ、LogLevelをdebugに変更すると、そのエラーの前に次のようになります。

[Tue Jul 11 23:00:38.641568 2017] [core:debug] [pid 26561] protocol.c(1273): [client 188.64.25.162:23165] AH00566: request failed: malformed request line
[Tue Jul 11 23:00:38.641634 2017] [headers:debug] [pid 26561] mod_headers.c(900): AH01503: headers: ap_headers_error_filter()

したがって、この後、同じエラーが発生します。

SSL Library Error: error:140940F4:SSL routines:ssl3_read_bytes:unexpected message

openssl version
OpenSSL 1.1.0f  25 May 2017
7
user134969

サーバーがSSLv3またはTLSv1をネゴシエートしているかどうかは、そのエラーからはわかりません( この質問をUnixおよびLinuxで確認してください どこでも無効になっていることを確認してくださいApacheで...)--- 1.1.0fソースコード GitHubのここ 意図的に2つをぼかします...

_   if (enc_err < 0) {
    /*
     * A separate 'decryption_failed' alert was introduced with TLS 1.0,
     * SSL 3.0 only has 'bad_record_mac'.  But unless a decryption
     * failure is directly visible from the ciphertext anyway, we should
     * not reveal which kind of error occurred -- this might become
     * visible to an attacker (e.g. via a logfile)
     */
    al = SSL_AD_BAD_RECORD_MAC;
    SSLerr(SSL_F_SSL3_GET_RECORD,
           SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC);
    goto f_err;
}
_

したがって、暗号スイートを並べ替えることができます。

_SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SSLv3:!SSLv2:!TLSv1_

POODLEの脆弱性に関するaskubuntuに関するこの投稿 には、SSLインスペクションと配管に関するリソースの優れたリストがあります。

Mozilla設定ジェネレーター優れた公共サービスです。

「このエラーを5回のクリックごとに取得する」というコメントは少し奇妙です。 clicksを意味しますか、それとも5行ごとがログの不正なリクエストですか? Apacheをシングルスレッド(-Xフラグ)で起動してみて、それが同じことを行うかどうか、または_SSLSessionTickets off_を設定してみてください。

ここでの私の考えは、問題の原因としてスレッド化とセッション/キャッシュの一貫性/一貫性を排除することです。 Apacheをシングルスレッドで実行する(-Xフラグで開始する)ことは、これを実現する1つの方法です。別の方法は、_MaxClients=1_を設定することです(少なくともMPMモデルで)。セッションチケットはこれまでTLSv1.2で問題の原因となっており、デフォルトで有効になっています。これが_SSLSessionTickets off_の背後にある理由です(これは、セッションCookieではなく、SSL "Server Hello"メッセージの一部です。または類似)。 「5回ごとのクリック」エラーは依然として私を悩ませます-ほとんどのブラウザは4つのリソース要求を1つのパイプラインでパイプライン化し、新しい接続(新しいsslハンドシェイクなど)を開くことに気づかざるを得ません。 5番目の場合...パケットキャプチャなしでは、実際に何が起こっているのかを言うのは困難です。

エラーの原因としての暗号ネゴシエーションを排除したように見えます(私が誤っていない限り、はるかに厳しい暗号仕様の下でエラー条件を複製できます)。 SSLを再ネゴシエートして(キックのためだけなど)、エラーをトリガーできるかどうかを知りたいと思います。_openssl s_client -connect server:443_を入力し、「R」と入力して、ログの内容を確認します。
また、セッションキャッシングがs_clientの_-reconnect_オプションで機能しているかどうかを確認します。
何かはSSLリクエストの受信コンテキストについて異なる必要があり、それを理解する最良の方法であると思われます(バイトごとの検査を除く)匿名化するのは難しいかもしれませんが、ネットワーク上で何が起こっているかということは、聴いているもののサイズ(つまり、リスナーの数)を厳しく制限することです。

私が試してみる他のデバッグツール(パケットキャプチャの投稿は問題外と想定しています...)
- ssltap (ubuntuでは_libnss3-tools_内)
- 暗号スキャン
- sslscan

[〜#〜]更新[〜#〜]
ssltapを介してこれを突っ込むと、 OpenSSLバグ#3712が再浮上したように見えます (読み取り/書き込み中のキーの再ネゴシエーション、基本的に)。パフォーマンスを低下させない適切な回避策を探します。楽しいもの!

8
quadruplebucky

私はこれを以前に見たことがありますが、実際には以前にありました。

私の場合の答えは非常に微妙なものになってしまいました。

ネットワークアダプターが有効になっているTCPセグメントオフロード。何らかの形式のバグが原因で、一部のメッセージの最後の数バイトがマングリング(または切り捨てられ、記憶できません)したため、MACがオンになっていました。失敗するSSLレコード。

これはVMWare上の仮想マシンでした。

あなたの環境でTSO/GSO/GROを無効にして、問題が解消するかどうかを確認してみます。

ethtool -K eth0 tso off gro off gso off ufo off
6
Matthew Ife

OpenSSLとマルチスレッドには、いくつかの奇妙な点があります。どのMPMを使用していますか?これがマルチスレッド関連である場合、「ワーカー」と「イベント」が影響を受ける可能性がある間、「プリフォーク」は安全であるはずです。

負荷プロファイルで許可されている場合は、プリフォークに切り替えて問題が解決するかどうかを確認できます。

3
Andreas Rogge

最初にchromeが更新されていることを確認してください。古いバージョンでは、特定の暗号で問題が発生します。この問題は、Amazonなどの一般的なサイトで自分自身にchromiumを使用した場合に発生しました。

次に、従った「暗号リスト」でプロトコルを禁止するというアドバイスは非常に悪い考えです。プロトコルは禁止されないため、SSLv3以降で機能するものを含むほとんどの暗号が禁止されます(ただし、SSL3を有効にしているという意味ではありません) SSLv3暗号を許可します)、互換性のためにMozilla SSL構成ジェネレーターによって提供されるより一般的なリストを使用します(SSLv2はもはや存在しないか、httpdまたはopensslでサポートされているため、明示的に禁止する理由はありません)、おそらく以前の組み合わせは厳格でした、これを試してください:

SSLProtocol             all -SSLv3
SSLCipherSuite          ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS

それでも問題が解決しない場合は、SSLのデバッグを有効にして、httpdの発言を確認してください(1〜2回だけ送信して、このログを無効にすると、ノイズが多すぎます)。

LogLevel ssl:trace3

傍注:SSLCertificateChainFileを削除して削除することもできます。そのディレクティブは2.4で廃止されたためです。 SSLCertificateFileチェーンを追加し、すべての証明書をリーフからルートにソートするか、SSLCertificateChainFileをSSLCACertificateFileに変更することもできます(ただし、これは主にSSL認証に使用されます)。

追加する必要があります(まだ追加していない場合)。

SSLRandomSeed startup file:/dev/urandom 2048
SSLRandomSeed connect file:/dev/urandom 2048
SSLSessionCache shmcb:/path/to/log/ssl_gcache_data(512000)

編集:私たちの会話に続いて、opensslのインストールをチェックするか、httpdが使用するバージョンと本当に同じかどうかを確認します。

このコマンドを発行して、コマンドの内容を見てみましょう:openssl ciphers -v 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'

また、opensslバージョンが正しいものであることを確認するには、次のコマンドを実行します。

openssl version
0
ezra-s