Skip to main content

症状

同じマシン上で、curlに対するapi.apiyi.comは正常に動作しますが、Pythonプログラム(特にConda環境)では次のエラーが発生します。
ポート443での接続タイムアウトや、ハンドシェイク中の切断として現れる場合もあります。VPNは使用しておらず、ネットワークを切り替える(たとえばスマートフォンのテザリングを使用する)と、再び正常に動作します。

短い回答

これは APIYI のサーバー側の問題でも証明書の問題でもありません。お使いの OpenSSL バージョンが、ネットワーク上の中間機器と互換性がありません。 両側の OpenSSL バージョンを比較してください。
失敗している側が OpenSSL 3.5 以降で、動作している側が 3.5 未満の場合、これが原因である可能性はほぼ確実です。

発生する理由

OpenSSL 3.5 以降、TLS ハンドシェイクにはデフォルトで耐量子鍵交換(X25519MLKEM768)が含まれます。これにより、最初のハンドシェイクメッセージ(ClientHello)は約 300 バイトから約 1500 バイトへと大きくなり、単一の TCP セグメントよりも大きくなるため、2 つのセグメントに分割されます。 一部の企業ファイアウォール、TLS インスペクションアプライアンス、および ISP 側のディープパケットインスペクションデバイスは、分割された ClientHello を処理できない、または新しい鍵交換アルゴリズムを認識できず、単に接続を閉じます。クライアントには「プロトコル違反により EOF が発生しました」と表示されます。 すべての APIYI エッジノードは、この耐量子ハンドシェイクをサポートしています。2026-09-11 (UTC+8) に、各ノードを OpenSSL 3.6.4 で検証し、すべて合格しました。ハンドシェイクパケットは当社に到達する前にお客様のネットワーク内で破棄されているため、サーバー側で解決できることはありません。

確認する3つのコマンド

失敗している環境で、opensslバイナリを使用して以下を実行します(最初にConda環境を有効化してください)。

修正方法(いずれか1つを選択)

1

オプション1:設定ファイルでポスト量子鍵交換を無効にする(推奨)

たとえば、次のファイルを作成します ~/no-pq.cnf
プログラムを実行する前に、環境変数を設定します:
その環境内のすべてのOpenSSLベースのプログラム(Python、curl、pipなど)は、ポスト量子鍵共有の送信を停止し、ClientHelloのサイズは約300バイトに戻ります。暗号化強度は変わりません。これは、3.5以前のデフォルト動作に戻すだけです。
2

オプション2:CondaでOpenSSLをダウングレードする

3.5より前のバージョンでは、ポスト量子鍵交換はデフォルトで有効になりません。OpenSSLに依存するパッケージも変更される可能性があるため、まずステージング環境でテストしてください。
3

オプション3:ネットワークチームにミドルボックスの更新を依頼する

主流のファイアウォールとTLSインスペクションアプライアンスは、2025年以降にリリースされたファームウェアで、ハイブリッドポスト量子ハンドシェイクをサポートしています。これは恒久的な修正であり、他のサイトでも同じ障害が発生するのを防ぎます。

追加の質問

ブラウザとプログラムでは、ネットワーク経路が異なる場合があります(ブラウザではシステムプロキシが使用されることがあります)。また、ブラウザは接続に失敗すると、ポスト量子共有なしでハンドシェイクを自動的に再試行します。プログラムはそのように動作しません。
TLS ライブラリが OpenSSL 3.5 以降であるクライアントであれば、curl 8.x のように新しい OpenSSL に対してビルドされたものを含め、発生する可能性があります。Go と Java はそれぞれ独自の TLS スタックを使用しており、ポスト量子交換がデフォルトで有効になるかどうかはバージョンによって異なります。診断方法は同じです。上記の 3 つのコマンドを使用して、デフォルトのハンドシェイクだけが失敗するかどうかを確認してください。
いいえ。接続は、証明書の検証が始まる前のハンドシェイク中に切断されています。検証を無効にしても解決せず、セキュリティリスクが増加します。
最初のハンドシェイクメッセージはクライアントから送信されます。ネットワーク内部でそのメッセージが破棄されると、サーバーは受信できないため、サーバー設定では解決できません。3 つのコマンドによって、他のサイトに対するデフォルトのハンドシェイクは成功する一方で、api.apiyi.com に対してのみ失敗することが示された場合は、結果をお送りください。さらに調査します。

関連

APIを使用するにはプロキシが必要ですか?

APIYIはプロキシやVPNなしの直接接続に対応しています

タイムアウト設定

接続タイムアウトと読み取りタイムアウトの設定方法