web-dev-qa-db-ja.com

opensslハンドシェイク中に「SSL:アラート["書き込み"]:致命的:不正なレコードMac」を取得しています

SSL: alert ["write"]: fatal : bad record macハンドシェイク中のOPENSSLログから、クライアントはアプリケーションデータを送信しておらず、ハンドシェイクを何度も作成しています。

誰かがこれで私を助けてください問題は何でしょうか?

12
Kalai

このようなメッセージは、一方の当事者(サーバーなど)からもう一方の当事者(クライアントなど)に送信され、その当事者が送信した暗号要素に問題があることを示します。 名目上 、これは次の条件で発生します:

bad_record_mac
   This alert is returned if a record is received with an incorrect
   MAC.  This alert also MUST be returned if an alert is sent because
   a TLSCiphertext decrypted in an invalid way: either it wasn't an
   even multiple of the block length, or its padding values, when
   checked, weren't correct.  This message is always fatal and should
   never be observed in communication between proper implementations
   (except when messages were corrupted in the network).

SSL/TLSハンドシェイクでは、任意のパーティによって送信される最初のencryptedメッセージは、アプリケーションデータの前にあるFinishedハンドシェイクメッセージです。暗号がうまくいかなかった場合、これはその時点でbad_record_macアラート。

非対称鍵交換が失敗した場合、たとえば、サーバーがクライアントから送信されたRSAで暗号化された「プリマスターシークレット」を解読しようとしたが、適切に暗号化されたRSAメッセージが見つからなかった場合、最新のサーバー実装のほとんどはランダムなプリマスターシークレットで続行されます。これは Bleichenbacher attack に対する防御策であり、RSAステージ以降で復号化が失敗したかどうかを推測して、サーバーの秘密鍵に関する追加情報を取得しようとします。これらの攻撃に対抗するため、サーバーはFinishedメッセージまでエラーを「遅延」し、実際のエラーnotを試行して、エラーの正確な原因を説明します。したがって、bad_record_macは通常、整合性チェックレイヤーの問題です。このようなエラーはany暗号関連の問題で発生する傾向があります。

考えられる原因は次のとおりです。クライアントは、実際のサーバーのプライベートと一致するnotと主張するサーバー公開鍵を使用していますキー。通常、クライアントはサーバーからサーバーの公開鍵を抽出しますcertificate。これはサーバーがハンドシェイク中にクライアントに送信します。サーバーは、公開鍵と数学的にリンクされた秘密鍵も所有しています。サーバーが誤ったファイルを使用するように構成されている場合は、観察された症状が発生する可能性があります。

ネットワーク監視ツール( Wireshark など)を使用してハンドシェイクメッセージを観察することをお勧めします。サーバーからのCertificateメッセージが表示され、サーバー証明書チェーンが含まれているはずです。そのチェーンの最初の証明書では、クライアントが使用するサーバーの公開鍵を抽出できます。サーバーで、サーバーprivateキーの詳細(これが簡単かどうかは、関係するソフトウェアと実際のキーストレージに依存するかどうか)を印刷して、それらが一致するかどうかを確認します。

その他の考えられる原因には、一部の暗号化アルゴリズムのバグのある実装が含まれます(クライアントまたはサーバー、あるいはその両方)。これらのエラーを特定するのは難しい場合があります。

デバッグの詳細を取得するには、opensslコマンドラインツールを使用してサーバーに接続することもできます。

openssl s_client -connect theservername:443 -msg -debug

options のいくつかを試して、プロトコルバージョン(-ssl2-ssl3-tls1...)とサポートされている暗号スイート(-ciphers)。最終的には、カスタムデバッグコードを挿入して、独自のバージョンの OpenSSL を再コンパイルすることもできます(中間値などを出力するため)。 OpenSSLはオープンソースであるため、Cプログラミングの知識があれば、技術的に実行可能です。

SSLプロトコルの詳細に精通していると役立ちます。出発点として this answer を参照してください。

18
Tom Leek