私は自分のサーバーを持っています(ここで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
サーバーが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が再浮上したように見えます (読み取り/書き込み中のキーの再ネゴシエーション、基本的に)。パフォーマンスを低下させない適切な回避策を探します。楽しいもの!
私はこれを以前に見たことがありますが、実際には以前にありました。
私の場合の答えは非常に微妙なものになってしまいました。
ネットワークアダプターが有効になっているTCPセグメントオフロード。何らかの形式のバグが原因で、一部のメッセージの最後の数バイトがマングリング(または切り捨てられ、記憶できません)したため、MACがオンになっていました。失敗するSSLレコード。
これはVMWare上の仮想マシンでした。
あなたの環境でTSO/GSO/GROを無効にして、問題が解消するかどうかを確認してみます。
ethtool -K eth0 tso off gro off gso off ufo off
OpenSSLとマルチスレッドには、いくつかの奇妙な点があります。どのMPMを使用していますか?これがマルチスレッド関連である場合、「ワーカー」と「イベント」が影響を受ける可能性がある間、「プリフォーク」は安全であるはずです。
負荷プロファイルで許可されている場合は、プリフォークに切り替えて問題が解決するかどうかを確認できます。
最初に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