Вопрос или проблема
Я работаю над проектом на 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) требуется случайное число, которое предоставляется устройством энтропии.
Возможные решения
-
Настройка устройства энтропии:
Убедитесь, что включено устройство для генерации энтропии. Для эмуляторов, таких как QEMU, может потребоваться настройка специального устройства, чтобы обеспечить доступ к источнику энтропии. Включите поддержку устройства энтропии в Kconfig вашего проекта, если вы еще этого не сделали:CONFIG_ENTROPY_GENERATOR=y
-
Использование псевдослучайного генератора:
Если в вашем проекте не требуется высококачественная криптографическая энтропия, вы можете использовать встроенные возможности генерации случайных чисел. Убедитесь, что ваш проект включает генератор случайных чисел:CONFIG_TEST_RANDOM_GENERATOR=y
-
Конфигурация инициализации TLS:
Проверьте настройки для библиотеки mbedTLS в вашем проекте. Убедитесь, что включены все необходимые параметры для работы с TLS:CONFIG_MBEDTLS=y CONFIG_MBEDTLS_BUILTIN=y CONFIG_NET_SOCKETS_SOCKOPT_TLS=y
-
Симуляция устройства энтропии в QEMU:
В целях тестирования, QEMU может поддерживать различные устройства, которые могут предоставить энтропию. Например, вы можете использовать компиляцию ядра с поддержкой устройства "virtio-rng". Добавьте необходимую конфигурацию в ваше устройство QEMU:-device virtio-rng-pci
-
Тестирование на реальных устройствах:
Хотя в данный момент у вас нет доступа к реальным устройствам, данный рендеринг может быть полезен для других разработчиков, работающих с Zephyr OS. Если у вас есть возможность в будущем, протестируйте свой проект на физическом устройстве, так как это может выявить неучтенные проблемы при выполнении.
Заключение
Проблема с инициализацией HTTP2-сервера в Zephyr OS, вызванная отсутствием устройства энтропии, может быть решена различными способами. Основные шаги включают в себя настройку генератора энтропии, проверку настроек TLS и возможное использование эмуляторов, таких как QEMU. Поскольку вы работаете с эмуляцией, важно удостовериться, что все устройства, необходимые для безопасной работы вашего приложения, правильно настроены и активны. Следуя предложенным рекомендациям, вы сможете устранить упомянутую проблему и успешно запустить ваш проект.