Как более детально работать с ATECCx08?

Добрый день,

Перечитав две самые известные статьи по теме (1 и 2) осталось впечатление некой темной магии, как правило возникающее при недостаточно подробных описаниях происходящего с OpenSSL

Например вот такой вопрос:
На моем контроллере есть файл /etc/ssl/certs/device_bundle.crt.pem в котором живут 2 сертификата:

  • Subject: C=RU, O=Contactless Devices LLC, OU=Device Certificate Authority, CN=Wiren Board Intermediate Certificate 0123ed07d06cebdbee
  • Subject: C=RU, L=Moscow, O=Contactless Devices LLC, OU=Production, CN=wirenboard-<серийный номер моего контроллера>

А как работать/где искать ключ кеонтроллера по данному сертификату?
Да и промежуточный сертификат подписан “Issuer: C=RU, L=Moscow, O=Contactless Devices LLC, OU=Device Certificate Authority, CN=Contactless Devices LLC Root Certificate/emailAddress=info@contactless.ru”, которого в бандле нет, то есть проверку врядли удатся пройти, если импортировать данный сертификат в свои системы

И вот еще вопрос:
В первой статье рекомендуется применить следующий шаманизм:

openssl req -new -engine ateccx08 -keyform engine -key ATECCx08:00:04:C0:00 -subj “/CN=wirenboard-AP6V5MDG” -out device_AP6V5MDG.csr

Как я понимаю, мы создаем Certificate Signature Request а частный ключь генерим на ATECCx08. Но какие значения мжоет принимать KeyID (08:00:04:C0:00)? Сколько слотов на крипточипе для собственных ключей есть у конечного пользователя и сколько их всего? Как посмотреть статус крипточипа?

А опишите задачу пожалуйста, так проще будет ответить.

Если очень кратко:

он же аппаратный, в этом и смысл. Его не надо искать, он в чипе.

Это наш рут сертификат, он есть в debian-репозитории и публичный.

первое число - слот, остальные менять не надо

atecc -c serial например, утилита из пакета atecc-util

А опишите задачу пожалуйста, так проще будет ответить

Задача №1 – застравить nginx и mosquitto работать с авторизацией и по https если обращение идет не с localhost и, возможно, местной локалки (2022-й год на дворе всетаки).
Для этого нужен набор сертификатов и ключ. Могу сгенерить свои но, как мне кажется, использовать встроенные в железку более правильно, если сценарии использования конечного сертификата поддерживают TLS Server

Задача №2 – авторизовывать устройство на системах сбора телеметрии и автоматизации более высокого уровня. Опять-же, могу сгенерить свои но, как мне кажется, использовать встроенные в железку более правильно, если сценарии использования конечного сертификата поддерживают TLS Client

Если сертификаты по каким-то причинам не подходят, хочется знать сколько слотов для своих ключей у меня есть (делать 2 сертификата один для клиента другой для сервера или один) и как ими манипулировать

он же аппаратный, в этом и смысл. Его не надо искать, он в чипе.

Как к нему обратится, чтобы использовать для авторизации? В каком слоте он прописан и какой у него KeyID?

Это наш рут сертификат, он есть в debian-репозитории и публичный.

В /etc/ssl/certs его нет. Где его можно найти и как проверить цепочку сертификатов?

нет, криптомодуль для этого совершенно не нужен.
Основная проблема с https - браузеру нужен домен.

Для этого криптомодуль можно использовать, да.

Какие именно системы будут? Какой там клиент?
Сейчас, чтобы это всё работало, нужна поддержка openssl и openssl engines в клиенте, запущенном на WB.

Только один слот.

Собственно именно это и делается в примерах на CryptodevATECCx08 Auth — Wiren Board

Нужно использовать библиотеку openssl, указать ей использование нужного engine, в качестве ключа передать страшную строчку, которую вы уже видели.

Здравствуйте. Заинтересовался данной темой.
На моем контроллере WB7 вывод такой:

root@iot-gw-murmansk-01:~# atecc -c serial
Attempts left: 10
Attempts left: 9
Attempts left: 8
Attempts left: 7
Attempts left: 6
Attempts left: 5
Attempts left: 4
Attempts left: 3
Attempts left: 2
Attempts left: 1
Command atcab_info is failed with status f0

Я правильно понимаю, что чипа в контроллере нет?

Здравствуйте! Чип должен быть во всех контроллерах. Попробуйте выполнить команду со следующими параметрами:

atecc -b2 -c serial
1 лайк

Помогло, спасибо.

Подскажите, как в таком случае использовать чип для создания запроса на сертификат устройства?

# openssl req -new -engine ateccx08 -keyform engine -key ATECCx08:00:04:C0:00 -subj "/CN=wirenboard-AP6V5MDG" -out device_AP6V5MDG.csr
engine "ateccx08" set.
cannot load Private Key from engine
3069243392:error:26096080:engine routines:ENGINE_load_private_key:failed loading private key:../crypto/engine/eng_pkey.c:78:
unable to load Private Key

Здравствуйте!

Точно так же, в key надо поправить 04 на 02.

Все отлично. Спасибо!

1 лайк

Как использовать с OpenVPN?

# openvpn --config /etc/openvpn/tm.conf --key engine:ateccx08:ATECCx08:00:02:C0:00
Wed Nov 16 15:15:15 2022 WARNING: cannot stat file 'engine:ateccx08:ATECCx08:00:02:C0:00': No such file or directory (errno=2)
Options error: --key fails with 'engine:ateccx08:ATECCx08:00:02:C0:00': No such file or directory
Options error: Please correct these errors.
Use --help for more information.

Я так понимаю нужен данный патч, который не вошел в openvpn. А пакет устанавливается с основного репозитория.

OpenVPN не видит движок ateccx08:

# openvpn --show-engines
OpenSSL Crypto Engines

Dynamic engine loading support [dynamic]

А вот с самим openssl все отлично, и весь функционал рабочий.

# openssl engine
(dynamic) Dynamic engine loading support
(ateccx08) Microchip ATECCx08 Engine

@webconn Никита, так как быть? Может я снова что-то не так делаю? Вроде бы все по инструкции.

У openvpn есть ключ engine, который по идее должен активировать аппаратный движок. Может быть с ним как-то нужно работать?

В документации указана такая команда:

openvpn --config example.ovpn --ca ca.crt --cert device_AP6V5MDG.crt --key engine:ateccx08:ATECCx08:00:04:C0:00

Попробуйте с таким же --key (четверка вместо двойки)

# openvpn --config /etc/openvpn/tm.conf --ca /etc/openvpn/tm/ca.crt --cert /etc/openvpn/tm/device.crt --key engine:ateccx08:ATECCx08:00:02:C0:00
Thu Nov 17 18:04:41 2022 WARNING: cannot stat file 'engine:ateccx08:ATECCx08:00:02:C0:00': No such file or directory (errno=2)
Options error: --key fails with 'engine:ateccx08:ATECCx08:00:02:C0:00': No such file or directory
Options error: Please correct these errors.
Use --help for more information.

Я имел в виду вот так:

--key engine:ateccx08:ATECCx08:00:04:C0:00

А в чем разница? Вывод результата команды ведь явно говорит о том, что openvpn неверно парсит аргумент --key, интерпритируя его как файл, не обращаясь к движку ateccx08.

Попробовал. Вывод абсолютно такой же.

Повторюсь о чем писал выше. По-умолчанию APT WirenBoard ставит пакет openvpn из основного репозитория, который не пропатчен Вашим патчем, поддерживающим парсинг ключевого слова engine в параметре --key.

Если Ваша команда добавит пропатченную версию, как и openssl, в Ваш репозиторий, то это станет решением вопроса. Правда как будет решаться проблема обновлений безопасности пакетов неясно. :thinking:

Лучшим вариантом было бы конечно согласование внесения изменений с разработчиками и мейнтейнерами openssl и openvpn в основной код проектов, либо нахождение альтернативы в виде использования параметров engine (что лучше), например. А так получается околополовинчатое решение. Вами проделана огромная работа, но до логического конца так и не доведена. :wink:

Вы все по документации делаете? Там есть настройки для конфигурирования доступа по i2c к крипточипу. Их сделали?

Если делать все исключительно по документации, то работать вообще ничего не будет. Например, в конфигурации openvpn содержится параметр, заключенный в тройные кавычки. Процесс openvpn запускается от root, зачем ему группа i2c?

Повторюсь, проблема в том, что версия openvpn, которая устанавливается не пропатчена. Поэтому и не парсится параметр в командной строке. Иначе сообщение об ошибке было бы совсем другое, а не то, что файл отсутствет.

Пожалуйста попробуйте перейти на testing с bullseye.
Там более новый openvpn, он позволяет указать явно --engine