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-сегмента, поэтому его приходится разделять на два сегмента. Некоторые корпоративные межсетевые экраны, устройства TLS-инспекции и устройства глубокой проверки пакетов на стороне ISP не могут обработать разделённый ClientHello или не распознают новый алгоритм обмена ключами и просто закрывают соединение. Клиент видит «EOF occurred in violation of protocol». Каждый пограничный узел APIYI поддерживает это постквантовое рукопожатие. 2026-09-11 (UTC+8) мы проверили каждый узел с OpenSSL 3.6.4, и все они успешно прошли проверку. Пакет рукопожатия отбрасывается внутри вашей сети до того, как достигает нас, поэтому на стороне сервера ничего нельзя исправить для вас.

Три команды для проверки

Запустите их с бинарным файлом openssl из среды, где возникает сбой (сначала активируйте окружение Conda):

Исправления (выберите один)

1

Вариант 1: Отключите постквантовый обмен ключами через файл конфигурации (рекомендуется)

Создайте файл, например ~/no-pq.cnf:
Установите переменную окружения перед запуском программы:
Каждая программа на основе OpenSSL в этой среде (Python, curl, pip и т. д.) перестанет отправлять постквантовую долю ключа, а ClientHello снова уменьшится примерно до 300 байт. Уровень криптографической стойкости не изменится. Это просто восстанавливает поведение по умолчанию, существовавшее до версии 3.5.
2

Вариант 2: Понизьте версию OpenSSL в Conda

Версии до 3.5 не включают постквантовый обмен ключами по умолчанию. Это также может изменить пакеты, зависящие от OpenSSL, поэтому сначала протестируйте это в среде предпродакшена.
3

Вариант 3: Попросите вашу сетевую команду обновить промежуточное устройство

Распространённые межсетевые экраны и устройства инспекции TLS поддерживают гибридные постквантовые рукопожатия в прошивках, выпущенных после 2025 года. Это постоянное решение, которое также предотвращает аналогичный сбой при подключении к другим сайтам.

Дополнительные вопросы

Браузер и ваша программа могут использовать разные сетевые маршруты (браузер может использовать системный прокси), а браузеры автоматически повторяют попытку установления соединения, не отправляя post-quantum расширение, если рукопожатие завершается ошибкой. Программы этого не делают.
Это может произойти с любым клиентом, чья TLS-библиотека — OpenSSL 3.5 или более новой версии, включая curl 8.x, собранный с актуальной версией OpenSSL. Go и Java используют собственные TLS-стеки, и включение post-quantum обмена по умолчанию зависит от их версий. Диагностика та же: выполните три приведённые выше команды, чтобы проверить, завершается ли ошибкой только рукопожатие по умолчанию.
Нет. Соединение закрывается во время рукопожатия, ещё до начала проверки сертификата. Отключение проверки не устраняет проблему и создаёт дополнительный риск для безопасности.
Первое сообщение рукопожатия отправляет клиент. Если оно отбрасывается внутри вашей сети, сервер никогда его не получает, поэтому никакая конфигурация сервера не поможет. Если три команды показывают, что рукопожатие по умолчанию успешно выполняется с другими сайтами, но завершается ошибкой только для api.apiyi.com, отправьте нам результаты, и мы проведём дополнительное расследование.

Связанные материалы

Нужен ли прокси для использования API?

APIYI поддерживает прямые подключения без прокси или VPN

Настройка тайм-аутов

Как настроить тайм-ауты подключения и чтения