Ruby で SMTP サーバーを作成しています。SSL/TLS エラー「復号化に失敗したか、レコードが正しくありません」を処理する正しい方法を理解しようとしています。
操作を再試行すると、#read_nonblock からランダムなガベージが吐き出され、失礼で接続を閉じる以外に、何をすべきかわかりません
あなた自身がここでサーバーであるため、メッセージは、OpenSSL がクライアントから送信された TLS レコードを適切に復号化できなかったか、MAC 計算が失敗したことを示します。つまり、クライアントのタグが計算したものと一致しません。
バグやネットワーク エラー (EJP が述べたように) とは別に、これは誰かが送信したコンテンツを積極的に変更した場合、間違ったメッセージが送信された場合、または部分的なメッセージのみが送信された場合などにも発生する可能性があります。
いずれにせよ、サーバーとして、そのような接続を救おうとはしません。結局のところ、それは攻撃になる可能性があります。このイベントを処理する適切な方法は、SSLSocket#close
を実行しようとするを呼び出すことSSL_shutdown
です。これは、「クローズ通知」アラートをクライアントに送信しようとします。これは、これをクローズしようとしていることをピアに伝える適切な TLS の方法です。繋がり。
これが発生したクライアントとの通信を再開するには、ゼロから開始した新しい接続をネゴシエートします。
あなたはそれを処理することはできません。SSL ライブラリまたはピアのエラーであるか、非常にまれなネットワーク エラーです。接続を閉じるだけです。