Ruby コンテナのアップグレード以来、多くの問題が発生しています。

概要

そのため、Ruby alpine ベース コンテナ イメージをアップグレードしたときに、読み取り中に OpenSSL::SSL::SSLError SSL_read: Expected eof が大量に発生しました。私の理解する限り、この問題の主な理由は、openssl の 1.1 から 3 へのアップグレードが含まれていることです。1.1 にダウングレードした時期もありました。しばらくはうまくいきましたが、その後はうまくいきませんでした。おそらく、ある時点で openssl gem 自体もアップグレードしたと思われます。 「しばらくはダウングレードが機能していたのに、突然機能しなくなった理由」については十分に深く掘り下げていませんでした(ただし、これはいずれにせよここでは関係ありません。通常、私はダウングレードを悪い選択肢として考えており、それを選択したのは、初期の研究では十分な速さで結果が得られませんでした)。

openssl 3 (gem と libs) でそれを修正する方法を長い間調べた結果、次の設定を行うことで古い動作に戻すことができることがわかりました。

OpenSSL::SSL::SSLContext::DEFAULT_PARAMS = OpenSSL::SSL::SSLContext::DEFAULT_PARAMS.merge( 
  options: OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:options] + OpenSSL::SSL::OP_IGNORE_UNEXPECTED_EOF 
).freeze

(はい、その定数を上書きすることを誇りに思うべきではありません。想像できる最も侵襲性の低い方法で実行しようとしました)

私たちは今、これとともに生きています。しかし、それは私にとって間違っていると感じます。 そこで、具体的な問題のいくつかを掘り下げてみました。 1 つは、特定のソーシャル メディア識別子の URL をチェックする古いカスタム ソーシャル メディア バリデータに関するもので、これには OAuth 認証がなければアクセスできなくなります。したがって、承認の問題が原因で予期せぬ事態が発生しています。とにかく、それが私がグーグルで調べた考えられる根本原因の1つです。

しかし、私たちの主要な問題の 1 つについては、根本原因に近づくことができませんでした。そのため、画像のアップロードには Google ストレージ プロバイダーのアクティブ ストレージを使用しています。エラー トラッカーには、ミドルウェアから openssl/buffering.rb の 80 行目に直接ジャンプする 5 ステップの深さのバックトレースのみが表示されます。しかし、問題は ActiveStorage::Representations::RedirectController#show の間のどこかで発生しているようです。 Google が未だに間違った SSL 処理で応答しているとは想像できません (openssl が長い間予期せぬ EOF の無視をサポートしなければならなかったのはそれが理由でした)。しかし、私たちはここで何を間違っているのか、まったく予感がありません。

それで:アクティブストレージとGoogleストレージでこの問題を経験し、考えられる根本原因とそれを適切に修正する方法(SSLContextのデフォルトパラメータを上書きする代わりに)を知っている人はいますか?

今までありがとう

解決策

ssl_patch.rb のようなものを config/initializers に追加できます。

if OpenSSL::SSL.const_defined?(:OP_IGNORE_UNEXPECTED_EOF)
  OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:options] |= OpenSSL::SSL::OP_IGNORE_UNEXPECTED_EOF
end