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


7

私は自分のサーバー(実行している場所Apache/2.4.27)を持っていますが、今日(BraveとGoogle Chrome-異なるコンピューター)から、このエラーが自分のWebサイトから取得されていることに気付きました。

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

私もSSLProtocol all -SSLv2 -SSLv3virtualhost confファイルに追加しようとしましたが、同時にここでいくつか変更しました。/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

それは可能であるべきではないいずれかの原因が「悪い復号化やMAC」(警告20)へのエンドポイントの設定エラー。ファイアウォール、IDS、IPS、DLP、「スマート」ルーターなど、これらのクライアントとこのサーバーのネットワークに何かありますか?サーバー自体から、またはサーバーと同じセグメント上のマシンから接続を繰り返しテストできますか(これはデータに依存するため、準ランダムになる可能性があります)?
dave_thompson_085 2017

* .443仮想ホスト(必要に応じて仮想ホスト全体)の関連コンテンツと、「apachectl -S」の出力も表示して、誤った構成を破棄できるようにします。
ezra-s 2017

SSL v3に関するエラーメッセージの苦情ですが、設定では無効になっています...
alexus

あなたはOpenSSL 1.1.0fを使用していると言います。それは上にあり、両方のサーバーとあなたが上記のs_clientコマンドを発行したマシン上で?サーバーはどのプラットフォームで実行されていますか?特定の暗号スイートでエラーが発生するかどうかを確認したい場合があります。たとえば、s-clientコマンドの最後に「-cipher AES128-SHA」を追加するとどうなりますか?
Matt Caswell 2017

忍者:@alexus:関数ファイル名、およびいくつかのリテラルssl3*SSL3*OpenSSLは、これらのプロトコル間の技術的な類似性のため、TLS(1.0〜1.2)にも使用されます。user134969:「長さが短すぎる」も、構成によって引き起こされることはありませ。それが繰り返し可能な場合は、同じイベントのs_client -debug(プレーンRSA -cipherを使用していない場合は、RSAで)およびWiresharkキャプチャ取得して、実際のワイヤーデータを確認し、プログラムが表示するものと比較できるようにしてください。
dave_thompson_085 2017

回答:


8

サーバーが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回のクリックごとに取得する」というコメントは少し奇妙です。クリック数を意味しますか、それとも5行ごとがログの悪い要求ですか?apacheシングルスレッド(-Xフラグ)を起動してみて、それが同じことを行うかどうかを確認してくださいSSLSessionTickets off

ここでの私の考えは、問題の原因としてスレッド化とセッション/キャッシュの一貫性/一貫性を排除することです。apacheをシングルスレッドで実行する(-Xフラグで開始する)ことは、これを実現する1つの方法であり、もう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」と入力して、ログの内容を確認します。
また、セッションキャッシングが-reconnects_client のオプションで機能しているかどうかも確認してください。SSLリクエストの受信コンテキストについて
何かが異なる必要があり、それを理解する最良の方法(匿名化するのが難しいかもしれない、ネットワーク上で何が行われているかをバイトごとに検査するのではない)は厳しくすることですリスニングするサイズ(つまり、リスナーの数)を制限します。

その他のデバッグツールは、私が試してみた(質問の投稿パケットキャプチャを出していると仮定すると....)
- ssltap(中libnss3-tools上のubuntu)
- cipherscan
- sslscan

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


1
私はまた、より明示的なSSLCipherSuite宣言(Mozilla構成が生成するものに沿って)、LogLevelをinfoまたはdebug、tcpdump / wireshark pcapsなどに設定して、実際に何が起こっているのかを把握します。
quadruplebucky

1
cipherscan github.com/mozilla/cipherscanまたはsslscan github.com/rbsec/sslscan(多くのリポジトリでも同様)などのツールを試して、回帰する前に実際に何が起こっているのかを調べてみませんか?
quadruplebucky

SSLProtocol -SSLv3接続間違いSSL3ませんでした。OpenSSLの関数(およびソースファイル)で、ssl3で命名されたものは、1.2までのすべてのTLSプロトコルの一部であることに注意してください。SSLv3(および1.1.0のTLSv1のみ)暗号を削除すると、TLS1.2 未満のプロトコルはネゴシエートされなくなりますが、最新のブラウザーでは問題ありません。
dave_thompson_085 2017

@ user134969:Wiresharkがこれらの接続を復号化するには(したがって、ここで役立ちます)、キー交換をプレーンRSAに(一時的に)制限する必要があります。これは、Apache側でを使用して行うのが最も簡単SSLCiphers RSA+AESです。(そして、編集/環境設定/プロトコル/ SSLでサーバーのPrivateKeyファイルを提供しています。)Chromeは、プレーン-RSA(すなわち文句ために使用しませ PFS)が、私はちょうど再テストと私は今幸せであるように思われます。
dave_thompson_085

@quadruplebuckyシステム内の「ssl3_record.c」の場所を教えていただけますか?
user134969 2017

6

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

私の場合の答えは非常に微妙になった。

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

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

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

ethtool -K eth0 tso off gro off gso off ufo off

udp-fragmentation-offloadを変更できない
user134969

同じことをしますが、「ufo off」を省略します
Matthew Ife

1
パケットの切り捨ての原因となる可能性のある、もう1つおかしなことは、MTUの問題(ジャンボフレームをオンにするべきではないときにオンにする)またはトンネル経由でデータを送信する場合にTCPで必要なMSSクランプです。
Matthew Ife 2017

3

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

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


したがって、少なくともマルチスレッディングは除外されます:)
Andreas Rogge 2017

0

まず、クロムが更新されていることを確認します。古いバージョンでは、特定の暗号で問題が発生します。アマゾンなどの一般的なサイトでクロムについてこの問題を抱えていました

次に、従った「暗号リスト」でプロトコルを禁止するというアドバイスは非常に悪い考えです。プロトコルは禁止されないため、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

いいえ、解決しませんでした-私の編集を確認してください、ssl:trace3を使用するときにログを投稿しました...
user134969

opensslは事前にコンパイルされたバージョンですか、手動でコンパイルされたバージョンですか?
ezra-s 2017

@ user134969コマンドを追加して、問題がある場合に、opensslから暗号または十分な暗号を取得できるかどうかを確認できるようにします。
ezra-s 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.