Вопрос или проблема
Я создал сертификаты с помощью acme.sh (let’s encrypt) для своего домашнего маршрутизатора OpenWrt.
В конце было сообщение
[Пт Ноя 29 18:xx:xx UTC 2024] Промежуточный CA сертификат находится по адресу: /root/.acme.sh/somefqdn_ecc/ca.cer
[Пт Ноя 29 18:xx:xx UTC 2024] Полная цепочка сертификатов находится там: /root/.acme.sh/somefqdn_ecc/fullchain.cer
Я конвертировал сертификаты в DER и настроил uHTTPd. Chrome сообщает, что сертификат действителен, если я открываю luci или пытаюсь загрузить файл по https https://somefqdn/isos/undionly.kpxe
Затем я попытался собрать исходный код iPXE https://github.com/ipxe/ipxe.git
Пробовал для коммита 4f7dd7fbba205d413cf9b989f7cdc928fa02caf2 и для a3f1e8fb6707811e6eb90e339d7ebe813fd89a63
Запуская
make bin/ipxe.usb TRUST=$trustca CERT=$trustcert DEBUG=open,httpcore
где $trustca – это файл промежуточного CA /root/.acme.sh/somefqdn_ecc/ca.cer,
$trustcert – это полная цепочка сертификатов находится там: /root/.acme.sh/somefqdn_ecc/fullchain.cer
Обратите внимание, что я использую PEM сертификаты (как указано в документации), точно так же, как я их получаю из acme.sh, но не конвертирую в DER сертификаты.
Сборка завершается успешно. (Для a3f1e8fb6707811e6eb90e339d7ebe813fd89a63 пришлось использовать образ distrobox с Fedora 32 и старым gcc, make и т.д., чтобы избежать ошибок нового компилятора)
Когда я выполняю в KVM ВМ с содержимым bin/ipxe.usb (я запускаю dd для записи на виртуальный жесткий диск), я получаю следующее (я получаю ту же проблему, если я записываю bin/ipxe.usb на USB и пробую на реальной машине)
iPXE> imgfetch https://somefqdn/isos/undionly.kpxe
INTF Oxefe24+18 открытие https URI
https://somefqdn/isos/undionly.kpxe...INTF Oxf0544+18 открытие (SOCK_DGRAM,AF_UNKNOWN) сокета
INTF ©xf01?4+50 открытие (SOCK_STREAM,AF_INET) сокета
Ошибка: x420c6001 (http://ipxe.org/420c6001)
iPXE> imgfetch https://boot.ipxe.org/1mb
INTF @xef6b4+18 открытие https URI
‘boot.ipxe.org/Imb...INTF Oxeffd4+18 открытие (SOCK_DGRAM,AF_UNKNOWN) сокета
INTF @xefca4+50 открытие (SOCK_STREAM,AF_INET) сокета
INTF @xef9?4+18 открытие URI http://ca.ipxe.org/auto/c9Zeb62f.der?subject=MEBxCzA
JBGNUBAYTA LUTHSkuJuYDUQQKEYBIbnk lcm 14CBTZWN1cm] GeSBSZXN1YXU jaCBHem9 1cDEUMBMGA1U
EAXMMSUNSRYBSb2901F gx
INTF @xef974+18 открытие http URI
INTF ©xf@bc4+*18 открытие (SOCK_DGRAM,AF_UNKNOWN) сокета
INTF ©xf@0a4+10 открытие (SOCK_STREAM,AF_INET) сокета
Доступ запрещен (http://ipxe.org/0Z16eb3c)
Что я делаю не так? Как я могу собрать это, чтобы оно работало с HTTPS? Я включил предложенные параметры DEBUG, но ничего не помогает понять, что происходит.
Кажется, что загрузка происходит, так как отображаются точки, как будто что-то загружается, прежде чем появится ошибка, а затем в конце появляется какая-то ошибка.
Ответ или решение
Для успешной сборки iPXE с поддержкой HTTPS и устранения возникших проблем необходимо пройти через несколько ключевых этапов. Ваша текущая установка свидетельствует о том, что сертификаты были созданы корректно и конфигурация uHTTPd работает. Тем не менее, при загрузке iPXE через HTTPS возникают ошибки. Рассмотрим, что можно сделать для решения данной проблемы.
1. Проверка конфигурации сертификатов
Вы упомянули, что для целей сборки были использованы сертификаты в формате PEM. Убедитесь, что файлы ca.cer
(сертификат промежуточного CA) и fullchain.cer
(полная цепочка сертификатов) действительно находятся в формате PEM. Если вы конвертировали их в DER ранее, но затем использовали исходные PEM-файлы, это должно быть корректно. В любом случае, вы можете использовать утилиту openssl
для проверки формата и целостности сертификатов:
openssl x509 -in /root/.acme.sh/somefqdn_ecc/fullchain.cer -text -noout
openssl x509 -in /root/.acme.sh/somefqdn_ecc/ca.cer -text -noout
2. Обновление параметров сборки iPXE
Следующим шагом является настройка параметров сборки в iPXE. Убедитесь, что вы используете правильный путь к сертификатам. Попробуйте указать абсолютные пути и убедитесь, что у вас достаточно прав на чтение этих файлов:
make bin/ipxe.usb TRUST=/root/.acme.sh/somefqdn_ecc/ca.cer CERT=/root/.acme.sh/somefqdn_ecc/fullchain.cer DEBUG=open,httpcore
Также рассмотрите возможность использования параметра CFLAGS
для расширения отладки:
make bin/ipxe.usb TRUST=/root/.acme.sh/somefqdn_ecc/ca.cer CERT=/root/.acme.sh/somefqdn_ecc/fullchain.cer CFLAGS="-DDEBUG -DHTTP -DHTTPS"
3. Проверка сетевых соединений
Ошибки, такие как Error: x420c6001
, часто указывают на проблемы с сетевым соединением или SSL. Убедитесь, что ваш маршрутизатор и конфигурация сети позволяют iPXE корректно выполнять HTTPS-запросы. Для этого проверьте следующее:
- Убедитесь, что DNS-имя
somefqdn
правильно разрешается в IP-адрес вашего маршрутизатора. - При необходимости попробуйте временно заменить
https://somefqdn
на IP-адрес вашего роутера, напримерhttps://192.168.1.1
. - Используйте утилиты, такие как
curl
илиwget
, для тестирования возможности скачивания файла с вашего сервера напрямую:
curl -v https://somefqdn/isos/undionly.kpxe
4. Обработка ошибок SSL
Ошибка может также быть связана с неправильной проверкой сертификатов на уровне iPXE. Убедитесь, что iPXE корректно обрабатывает полученные сертификаты. Если SSL-сертификаты промежуточного CA или другие сертификаты не были правильно установлены или доверены, это может привести к ошибкам.
Для этого возможно потребуется включить дополнительные параметры, позволяющие игнорировать ошибки SSL (не рекомендуется на продуктиве), например:
imgfetch --no-verify https://somefqdn/isos/undionly.kpxe
5. Логи и отладка
Соберите дополнительно логи при выполнении iPXE с включённой отладкой. Для получения более детальной информации о том, что происходит, можно попробовать изменить уровень отладки, увеличив его:
make bin/ipxe.usb TRUST=$trustca CERT=$trustcert DEBUG=open,httpcore,debug
Заключение
Следуя этим шагам и рекомендациям, вы сможете диагностировать и решить проблему с загрузкой iPXE через HTTPS. Основное внимание уделите проверке сертификатов, их пути, а также настройкам сети и отладочным сообщениям. Если ошибка будет сохраняться, дополнительно проконсультируйтесь с документацией по iPXE или сообществом разработки iPXE для получения рекомендаций по специфическим ошибкам.