
2026/02/13 19:18
WolfSSL もまた酷いですね。それで、次はどうすればよいのでしょうか?
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
WolfSSLは組み込みデバイス向けに広く使われているTLSライブラリですが、開発者が
-DWOLFSSL_TLS13_MIDDLEBOX_COMPAT を明示的に有効化しない限り、TLS 1.3 の「ミドルボックス互換モード」をサポートしていません。この抜け漏れは実際の接続を破綻させます。なぜなら、多くのネットワークが RFC 8446 で定義されているミドルボックスパケット(空でないセッションIDとダミー change_cipher_spec レコード)に依存しているからです。この問題は、2023 年の Haproxy 記事で OpenSSL の遅延が指摘されたことを受け、著者が FreeBSD ビルド上で WolfSSL をテストした際に発覚し、正式に報告されました。
OpenSSL、BoringSSL、AWS‑LC、GnuTLS、LibreSSL など他のライブラリも同様に使い勝手の欠陥を抱えています。Erlang/OTP の SSL ライブラリは WolfSSL サーバーとの失敗を回避するためにデフォルトで
middlebox_comp_mode を有効化していましたが、TLS 1.3 接続を成功させるにはこれを無効化する必要があります。Elixir 1.17.3 の概念実証では、middlebox_comp_mode:true を有効にすると致命的な「unexpected message」エラーが発生し、false に設定すれば接続できることが示されています。
著者は開発者に対して、WolfSSL が準拠性を改善するまで LibreSSL を優先するよう勧告しています。適切な構成なしで WolfSSL を継続的に使用すると、接続問題が引き続き発生します。WolfSSL に依存している組み込みデバイスメーカーは、サポートコストの増大や安全に TLS 1.3 を採用するためにライブラリを切り替える必要があります。本稿は WolfSSL の欠点について学ぶ時間が多く費やされたことを嘆きつつ、主に警告として機能していると結論付けています。
翻訳対象テキスト
(incorporating the missing points):**
WolfSSL, a widely used TLS library for embedded devices, fails to support TLS 1.3’s required “middle‑box compatibility mode” unless developers explicitly enable it with
-DWOLFSSL_TLS13_MIDDLEBOX_COMPAT. This oversight breaks real‑world connections because many networks rely on the middle‑box packets (non‑empty session IDs and dummy change_cipher_spec records) mandated by RFC 8446. The problem surfaced when a 2023 Haproxy article highlighted OpenSSL’s slowdown, prompting the author to test WolfSSL in a FreeBSD build; during testing a bug was discovered and formally reported.
Other libraries—OpenSSL, BoringSSL, AWS‑LC, GnuTLS, and LibreSSL—have similar usability shortcomings. Erlang/OTP’s SSL library had to enable
middlebox_comp_mode by default to avoid failures with WolfSSL servers, but disabling it is required for successful TLS 1.3 connections. An Elixir 1.17.3 proof‑of‑concept demonstrates that enabling middlebox_comp_mode:true triggers a fatal “unexpected message” error, whereas setting it to false allows the connection.
The author advises developers to prioritize LibreSSL over WolfSSL until the latter improves compliance; continued use of WolfSSL without proper configuration will keep causing connectivity problems. Embedded‑device manufacturers relying on WolfSSL may face increased support costs or must switch libraries to adopt TLS 1.3 safely. The post ends with a lament that much time was spent learning about WolfSSL’s deficiencies, and the blog serves mainly as a warning rather than a solution.
本文
OpenSSLは酷い。
BoringSSL と AWS‑LC のフォークは Google や Amazon によって無限にクローンされ、彼らは自分たちのユースケースだけを気にしています。GnuTLS を使ったソフトウェアで良い経験があったかどうか覚えておらず、LibreSSL は不完全です…
今何が起きたのか?
昨年、Haproxy の記事で OpenSSL が極端に遅くなったと主張されました。これが私の興味を掻き立て、FreeBSD 用に WolfSSL にビルドされた Haproxy をパッケージ化する手助けをしました。Linux ディストリビューションとは異なり、FreeBSD は標準で WolfSSL 対応 Haproxy が入っている唯一の場所です。ユーザーは自分でビルドしなければなりません。
WolfSSL を使用した際にバグに遭遇し、報告して忘れた後、再び同じ問題に直面しました。動機づけられ、課題を再開し、デバッグを重ねて根本原因を突き止め、ドキュメント化しました。
TLS 1.3(RFC 8446)は TLS 1.2 と大きく異なり、多くの問題を引き起こしました。特に「TLS 1.3 の設計は、広く展開された非準拠の TLS ミドルボックスによって制約されている」という点です。
ミドルボックス・ヘル
ミドルボックスは見えないゴミで、トラフィックを改ざんでき、問題を引き起こすと初めて目立ちます。
- TLS 1.2 より優れたセキュリティ保証を望むが、ミドルボックスは TLS 1.2 しか理解しない。
- TLS 1.3 はミドルボックスに耐えるため、TLS 1.2 のふりをする必要があります。
著者らは Middlebox Compatibility Mode(ミドルボックス互換モード) を考案しました:
- クライアントは ClientHello に非空のセッション ID を設定してミドルボックスを騙す。
- クライアントとサーバーがダミー
レコードを交換(役に立たないが遅延を追加)。change_cipher_spec
逆転
RFC 8446 はこのモードを次のように定義しています:
この「互換モード」は部分的に交渉されます:クライアントはセッション ID を送るかどうか選択でき、サーバーはそれをエコーします。
クライアントが非空のセッション ID を送った場合、サーバーはこの付録で説明されたを送らなければならない。change_cipher_spec
WolfSSL は
-DWOLFSSL_TLS13_MIDDLEBOX_COMPAT でコンパイルしない限り、この規定を無視します。これにより「常時オン」または「オフ」のどちらかになります。その結果:
- WolfSSL は TLS 1.3 に関して RFC を遵守していません。
- ライブラリ開発者は問題修正に興味がなく、ユーザーに選択させる方針です。
これは多くの組み込みデバイスで WolfSSL が使用されているため重要です。セキュリティ観点からは TLS 1.3 クライアントでは常にミドルボックス互換モードを有効にすべきですが、現在のリリースでは実現できません。
原告
これまでで唯一確認した被害者は Erlang/OTP の SSL ライブラリです。Joe Armstrong のマントラ(「まず動かせ、次に美しくし、最後に本当に速くする」)を受けて、Erlang/OTP は
middlebox_comp_mode をデフォルトで有効にしました(速度向上のためオフにできるオプション付き)。結果として:
- すべての Elixir/Erlang HTTP クライアントが TLS 1.3 が利用可能な WolfSSL HTTPS サーバーへ接続できません。
今後は?
OpenBSD の LibreSSL 選択は正しいようです。LibreSSL に注力し、他のライブラリは放棄する方向に進むべきです。Haproxy は OpenSSL 3.0 の問題の影響を受けません(フォークが早い時点で切り離されたため)が、最適化が不足しています。これは時間とともに解消される妥当なトレードオフです。
TLS 終端を高速化しようとした試みは無駄だったことが分かり、このブログ投稿へ至った経緯です。警告としてお伝えします。
Elixir PoC
#!/usr/bin/env elixir url = "https://some-wolfssl-endpoint" url = String.to_charlist(url) {:ok, _} = Application.ensure_all_started(:inets) {:ok, _} = Application.ensure_all_started(:ssl) :logger.set_application_level(:ssl, :debug) http_options = [ ssl: [ verify: :verify_peer, cacerts: :public_key.cacerts_get(), depth: 2, customize_hostname_check: [ match_fun: :public_key.pkix_verify_hostname_match_fun(:https) ], versions: [:"tlsv1.2", :"tlsv1.3"], middlebox_comp_mode: true ] ] options = [body_format: :binary] :httpc.request(:get, {url, []}, http_options, options)
典型的なエラー:
11:00:44.996 [warning] Description: ~c"Failed to assert middlebox server message" Reason: [missing: {:change_cipher_spec, 1}] 11:00:45.014 [notice] TLS :client: In state :hello_middlebox_assert at ssl_gen_statem.erl:821 generated CLIENT ALERT: Fatal - Unexpected Message
middlebox_comp_mode を false に設定すると問題は解消します。