> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apiyi.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Python выдаёт SSLEOFError, но curl работает?

> В OpenSSL 3.5 и более поздних версиях обмен постквантовыми ключами включён по умолчанию; более крупное рукопожатие обрывается некоторыми сетевыми промежуточными устройствами, что приводит к UNEXPECTED_EOF_WHILE_READING

## Симптом

На одном и том же компьютере запрос `curl` к `api.apiyi.com` выполняется нормально, но программа на Python (особенно в окружении Conda) завершается с ошибкой:

```text theme={null}
ssl.SSLEOFError: [SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1016)
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='api.apiyi.com', port=443): Max retries exceeded
```

Иногда это проявляется как тайм-аут подключения к порту 443 или разрыв соединения во время рукопожатия. VPN не используется, а при смене сети (например, при подключении к точке доступа телефона) всё снова работает.

## Краткий ответ

**Это не проблема на стороне сервера APIYI и не проблема с сертификатом. Ваша версия OpenSSL несовместима с промежуточным сетевым устройством в вашей сети.**

Сравните версии OpenSSL с обеих сторон:

```bash theme={null}
curl --version | head -1          # e.g. OpenSSL/3.0.2
python -c "import ssl; print(ssl.OPENSSL_VERSION)"   # e.g. OpenSSL 3.6.2
```

Если на стороне, где возникает сбой, используется **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):

```bash theme={null}
# 1. Default settings, with post-quantum key exchange
openssl s_client -connect api.apiyi.com:443 -servername api.apiyi.com </dev/null | grep -E "Negotiated|Verify"

# 2. X25519 only, no post-quantum key exchange
openssl s_client -connect api.apiyi.com:443 -servername api.apiyi.com -groups X25519 </dev/null | grep Verify

# 3. Default handshake against any other HTTPS site
openssl s_client -connect www.google.com:443 -servername www.google.com </dev/null | grep Verify
```

| Результат                          | Диагноз                                                                                                       |
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------- |
| 1 завершается с ошибкой, 2 успешно | Подтверждено: большое рукопожатие обрезается вашей сетью. Исправьте это на стороне клиента, как показано ниже |
| 1 и 3 оба завершаются с ошибкой    | Ваша сеть блокирует каждое постквантовое рукопожатие. То же исправление на стороне клиента                    |
| 1, 2 и 3 успешно                   | Другая проблема. Отправьте в поддержку полную ошибку и вывод `pip show urllib3 requests`                      |

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

<Steps>
  <Step title="Вариант 1: Отключите постквантовый обмен ключами через файл конфигурации (рекомендуется)">
    Создайте файл, например `~/no-pq.cnf`:

    ```ini theme={null}
    openssl_conf = openssl_init
    [openssl_init]
    ssl_conf = ssl_sect
    [ssl_sect]
    system_default = system_default_sect
    [system_default_sect]
    Groups = X25519:P-256:P-384
    ```

    Установите переменную окружения перед запуском программы:

    ```bash theme={null}
    export OPENSSL_CONF=~/no-pq.cnf
    python your_script.py
    ```

    Каждая программа на основе OpenSSL в этой среде (Python, curl, pip и т. д.) перестанет отправлять постквантовую долю ключа, а ClientHello снова уменьшится примерно до 300 байт. Уровень криптографической стойкости не изменится. Это просто восстанавливает поведение по умолчанию, существовавшее до версии 3.5.
  </Step>

  <Step title="Вариант 2: Понизьте версию OpenSSL в Conda">
    ```bash theme={null}
    conda install "openssl<3.5"
    ```

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

  <Step title="Вариант 3: Попросите вашу сетевую команду обновить промежуточное устройство">
    Распространённые межсетевые экраны и устройства инспекции TLS поддерживают гибридные постквантовые рукопожатия в прошивках, выпущенных после 2025 года. Это постоянное решение, которое также предотвращает аналогичный сбой при подключении к другим сайтам.
  </Step>
</Steps>

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

<AccordionGroup>
  <Accordion title="Почему браузер открывает api.apiyi.com, а моя программа — нет?">
    Браузер и ваша программа могут использовать разные сетевые маршруты (браузер может использовать системный прокси), а браузеры автоматически повторяют попытку установления соединения, не отправляя post-quantum расширение, если рукопожатие завершается ошибкой. Программы этого не делают.
  </Accordion>

  <Accordion title="Может ли такое произойти с Node.js, Go или Java?">
    Это может произойти с любым клиентом, чья TLS-библиотека — OpenSSL 3.5 или более новой версии, включая curl 8.x, собранный с актуальной версией OpenSSL. Go и Java используют собственные TLS-стеки, и включение post-quantum обмена по умолчанию зависит от их версий. Диагностика та же: выполните три приведённые выше команды, чтобы проверить, завершается ли ошибкой только рукопожатие по умолчанию.
  </Accordion>

  <Accordion title="Поможет ли подключение по IP или установка verify=False?">
    Нет. Соединение закрывается во время рукопожатия, ещё до начала проверки сертификата. Отключение проверки не устраняет проблему и создаёт дополнительный риск для безопасности.
  </Accordion>

  <Accordion title="Может ли APIYI отключить post-quantum рукопожатия на сервере?">
    Первое сообщение рукопожатия отправляет клиент. Если оно отбрасывается внутри вашей сети, сервер никогда его не получает, поэтому никакая конфигурация сервера не поможет. Если три команды показывают, что рукопожатие по умолчанию успешно выполняется с другими сайтами, но завершается ошибкой только для api.apiyi.com, отправьте нам результаты, и мы проведём дополнительное расследование.
  </Accordion>
</AccordionGroup>

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

<CardGroup cols={2}>
  <Card title="Нужен ли прокси для использования API?" icon="wifi" href="/ru/faq/network-proxy">
    APIYI поддерживает прямые подключения без прокси или VPN
  </Card>

  <Card title="Настройка тайм-аутов" icon="clock" href="/ru/faq/timeout-configuration">
    Как настроить тайм-ауты подключения и чтения
  </Card>
</CardGroup>
