Не удается инициализировать HTTP2 сервер в Zephyr OS

Вопрос или проблема

Я работаю над проектом на Zephyr OS и сталкиваюсь с проблемой при попытке запустить приложение в эмуляторе QEMU. Система загружается нормально, но сервер HTTP2 не может инициализироваться и продолжает перезапускаться. Сообщение об ошибке указывает, что TLS-связь небезопасна из-за отсутствия устройства энтропии, и инициализация сервера HTTP2 постоянно терпит неудачу. У меня нет реального устройства.

# Общая конфигурация
CONFIG_MAIN_STACK_SIZE=3072
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048
CONFIG_SHELL=y
CONFIG_LOG=y
CONFIG_ENTROPY_GENERATOR=y
CONFIG_TEST_RANDOM_GENERATOR=y
CONFIG_INIT_STACKS=y
CONFIG_ZVFS_OPEN_MAX=32
CONFIG_POSIX_API=y
CONFIG_FDTABLE=y
CONFIG_ZVFS_POLL_MAX=32

# Eventfd
CONFIG_EVENTFD=y

# Конфигурация сети
CONFIG_NETWORKING=y
CONFIG_NET_IPV4=y
CONFIG_NET_IPV6=y
CONFIG_NET_TCP=y
CONFIG_NET_SOCKETS=y
CONFIG_NET_CONNECTION_MANAGER=y
CONFIG_NET_SHELL=y
CONFIG_NET_STATISTICS=y
CONFIG_NET_STATISTICS_USER_API=y
CONFIG_NET_LOG=y

# JSON
CONFIG_JSON_LIBRARY=y

# HTTP парсер
CONFIG_HTTP_PARSER_URL=y
CONFIG_HTTP_PARSER=y
CONFIG_HTTP_SERVER=y
CONFIG_HTTP_SERVER_WEBSOCKET=y

# Сетевые буферы
CONFIG_NET_PKT_RX_COUNT=16
CONFIG_NET_PKT_TX_COUNT=16
CONFIG_NET_BUF_RX_COUNT=128
CONFIG_NET_BUF_TX_COUNT=128
CONFIG_NET_CONTEXT_NET_PKT_POOL=y

# Опции IP-адреса
CONFIG_NET_IF_UNICAST_IPV6_ADDR_COUNT=3
CONFIG_NET_IF_MCAST_IPV6_ADDR_COUNT=4
CONFIG_NET_MAX_CONTEXTS=32
CONFIG_NET_MAX_CONN=32

# Конфигурация сетевого адреса
CONFIG_NET_CONFIG_SETTINGS=y
CONFIG_NET_CONFIG_NEED_IPV4=y
CONFIG_NET_CONFIG_NEED_IPV6=y
CONFIG_NET_CONFIG_MY_IPV4_ADDR="192.0.2.1"
CONFIG_NET_CONFIG_PEER_IPV4_ADDR="192.0.2.2"
CONFIG_NET_CONFIG_MY_IPV4_GW="192.0.2.2"
CONFIG_NET_CONFIG_MY_IPV6_ADDR="2001:db8::1"
CONFIG_NET_CONFIG_PEER_IPV6_ADDR="2001:db8::2"

# Конфигурация TLS
CONFIG_MBEDTLS=y
CONFIG_MBEDTLS_BUILTIN=y
CONFIG_MBEDTLS_ENABLE_HEAP=y
CONFIG_MBEDTLS_HEAP_SIZE=60000
CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=2048
CONFIG_MBEDTLS_USE_PSA_CRYPTO=n
CONFIG_NET_SOCKETS_SOCKOPT_TLS=y
CONFIG_NET_SOCKETS_TLS_MAX_CONTEXTS=6
CONFIG_TLS_CREDENTIALS=y
CONFIG_TLS_MAX_CREDENTIALS_NUMBER=5

# Настройки сети
# Необходимы для обработки большого количества последовательных соединений,
# например, при тестировании с ApacheBench.
CONFIG_NET_TCP_TIME_WAIT_DELAY=0

# Драйверы устройств
CONFIG_GPIO=y
CONFIG_LED=y

# Конфигурация отладки сети
CONFIG_NET_SOCKETS_LOG_LEVEL_DBG=n
CONFIG_NET_HTTP_LOG_LEVEL_DBG=n
CONFIG_NET_IPV6_LOG_LEVEL_DBG=n
CONFIG_NET_IPV6_ND_LOG_LEVEL_DBG=n

ошибка:

-- west build: запуск целевой run

[0/1] Для выхода из QEMU введите: 'CTRL+a, x'[QEMU] CPU: qemu32,+nx,+pae
SeaBIOS (версия zephyr-v1.0.0-0-g31d4e0e-dirty-20200714_234759-fv-az50-zephyr)
Загрузка из ROM..
*** Загрузка Zephyr OS версии v4.0.0-rc1-22-g14478cafa6a4 ***
[00:00:00.020,000] net_sock_tls: Нет устройства энтропии в системе, TLS-связь небезопасна!
[00:00:00.020,000] net_config: Инициализация сети
[00:00:00.020,000] net_config: IPv4 адрес: 192.0.2.1
[00:00:00.120,000] net_config: IPv6 адрес: 2001:db8::1
[00:00:00.120,000] net_config: IPv6 адрес: 2001:db8::1
[00:00:00.120,000] smart_bulb_emulator: Настройка TLS завершена
[00:00:00.120,000] net_http_server: Все службы завершились неудачей (0)
[00:00:00.120,000] net_http_server: Не удалось инициализировать сервер HTTP2
[00:00:00.120,000] net_http_server: Перезапуск сервера (-3)
[00:00:01.130,000] net_http_server: Все службы завершились неудачей (0)
[00:00:01.130,000] net_http_server: Не удалось инициализировать сервер HTTP2
[00:00:01.130,000] net_http_server: Перезапуск сервера (-3)
[00:00:02.140,000] net_http_server: Все службы завершились неудачей (0)
[00:00:02.140,000] net_http_server: Не удалось инициализировать сервер HTTP2
[00:00:02.140,000] net_http_server: Перезапуск сервера (-3)
uart:~$ qemu-system-i386: завершение на сигнал 2

Ответ или решение

На вашем проекте на операционной системе Zephyr возникает проблема с инициализацией HTTP2-сервера в эмуляторе QEMU. Ошибка указывает на отсутствие устройства энтропии, что делает TLS-связь незащищённой. Это может быть причиной повторной неудачи инициализации HTTP2 сервера и его перезапуска. В данном тексте мы рассмотрим возможные шаги для устранения этой проблемы.

Понимание проблемы

Согласно вашему описанию, при загрузке системы в QEMU, сервер HTTP2 не может быть инициализирован, и в логе появляется сообщение о том, что "TLS communication is insecure!". Это подразумевает, что для шифрования TLS (Transport Layer Security) требуется случайное число, которое предоставляется устройством энтропии.

Возможные решения

  1. Настройка устройства энтропии:
    Убедитесь, что включено устройство для генерации энтропии. Для эмуляторов, таких как QEMU, может потребоваться настройка специального устройства, чтобы обеспечить доступ к источнику энтропии. Включите поддержку устройства энтропии в Kconfig вашего проекта, если вы еще этого не сделали:

    CONFIG_ENTROPY_GENERATOR=y
  2. Использование псевдослучайного генератора:
    Если в вашем проекте не требуется высококачественная криптографическая энтропия, вы можете использовать встроенные возможности генерации случайных чисел. Убедитесь, что ваш проект включает генератор случайных чисел:

    CONFIG_TEST_RANDOM_GENERATOR=y
  3. Конфигурация инициализации TLS:
    Проверьте настройки для библиотеки mbedTLS в вашем проекте. Убедитесь, что включены все необходимые параметры для работы с TLS:

    CONFIG_MBEDTLS=y
    CONFIG_MBEDTLS_BUILTIN=y
    CONFIG_NET_SOCKETS_SOCKOPT_TLS=y
  4. Симуляция устройства энтропии в QEMU:
    В целях тестирования, QEMU может поддерживать различные устройства, которые могут предоставить энтропию. Например, вы можете использовать компиляцию ядра с поддержкой устройства "virtio-rng". Добавьте необходимую конфигурацию в ваше устройство QEMU:

    -device virtio-rng-pci
  5. Тестирование на реальных устройствах:
    Хотя в данный момент у вас нет доступа к реальным устройствам, данный рендеринг может быть полезен для других разработчиков, работающих с Zephyr OS. Если у вас есть возможность в будущем, протестируйте свой проект на физическом устройстве, так как это может выявить неучтенные проблемы при выполнении.

Заключение

Проблема с инициализацией HTTP2-сервера в Zephyr OS, вызванная отсутствием устройства энтропии, может быть решена различными способами. Основные шаги включают в себя настройку генератора энтропии, проверку настроек TLS и возможное использование эмуляторов, таких как QEMU. Поскольку вы работаете с эмуляцией, важно удостовериться, что все устройства, необходимые для безопасной работы вашего приложения, правильно настроены и активны. Следуя предложенным рекомендациям, вы сможете устранить упомянутую проблему и успешно запустить ваш проект.

Оцените материал
Добавить комментарий

Капча загружается...