30 October 2019

Криптографический АРМ на базе стандартов с открытым ключом. Функции разбора и просмотра ASN1-структуры

CryptographyPythonDesktop environmentsIT StandardsDevelopment for Linux
Основной работой при создании утилиты cryptoarmpkcs было не разработка кода или графического интерфейса, а работа с ASN1-структурами. Именно в этих структурах хранятся сертификаты x509v3, электронные подписи документов (PKCS#7, CMS), запросы на сертификаты (PKCS#10, CSR), открытые и закрытые ключи, защищенные контейнеры PKCS#12/PFX, списки отозванных сертификатов CRL и штампы времени для электронной подписи, запросы и ответы OCSP и так далее и тому подобное. Постоянно приходилось просматривать уже имеющиеся структуры для понимания того как это делали другие, просматривать только что собранные самим AN1-структуры. Процесс понятен. Но поскольку я работаю на Linux (сейчас это Mageia, и код для Windows тоже готовлю на Linux), то под рукой из доступных средств разбора ASN1-структур были утилиты openssl и derdump из пакета NSS. Лично мои предпочтения были на стороне derdump. Именно она и стала прототипом рассматриваемой здесь утилиты derdump.tcl/tclderdump для просмотра ASN1-структур. И если вы сравните вывод утилиты derdump из пакета NSS и утилиты derdump.tcl, то вы практически не увидите различий:



Отличия касаются наименований oid-ов. Утилита имеет следующий синтаксис:

$dertcl.tcl <входной файл> <выходной файл | stdout> <1 | 0> <der | pem | hex>

где

  • <входной файл> — указывает путь к файлу с ASN1-структурой;
  • <выходной файл> — указывает на файл, где будет сохранен результат разбора: если в качестве выходого файла указано stdout, то результат будет отправлен в стандартный вывод;
  • третий параметр указывает на то, что надо выводить полную (1) информацию;
  • четвертый параметр задает формат входного файла, где der – это бинарный файл, pem указывает на то, что файл содержит данные в кодировке base64 с заголовком «-----BEGIN … — » и концевиком «-----END … — » как это принято в openssl, и, наконец, hex говорит, что файл содержит шестнадцатеричный код. При этом он может содержать и спецсимволы (\r, \n, \t), пробелы и символы «.» и «:». Откуда появились символы точка и двоеточие станет понятно ниже.

Формат hex был для меня просто жизненно необходим. Ведь для того, чтобы разобрать какой-нибудь кусок из распарсенного файла, приходилось переводить его в бинарный вид (der-кодировка) и сново пропускать через утилиту. Формат hex очень облегчил жизнь.

Конечно, пользоваться чистым кодом tcl (а впрочем как и любым другим скриптовым кодом, например, python) не совсем комфортно. Поэтому утилиты оформлена в дистрибутивы tclderdump для платформ Linux, Windows и OS X. Эти дистрибутивы самодостаточны: скачиваешь и запускаешь.

Однако вернемся к возможности просматривать ASN1-структуры, хранящиеся в шестнадцатеричном вид. Помимо выше упоминавшихся утилит для просмотра ASN1-структур есть еще хорошая утилита pyderasn, написанная на Python, которая в выводе использует символы точка и двоеточие, и было решено, что они тоже могут присутствовать в шестнадцатеричном коде. Ниже приводится результат распарсивания одного и того же сертификата x509 v.3 утилитами derdump.tcl и pederasn:



Но хотелось большего, а именно графического интерфейса и возможности распарсивать внутренние блоки налету. Было решено добавить этот функционал в утилиту cryptoarmpkcs, тем более, что ей есть куда развиваться, например, шифровать документы на сертификате адресата. И здесь опять не обойтись без просмотрщика ASN1-структур.

Для этих целей было решено переориентировать функциональную кнопку «Информация о токене». Мы именно переориентировали кнопку и закрепили за ней новый функционал «Просмотр ASN1-структуры», а информацию о подключенном токене по-прежнему можно получить, наведя курсор на имя токена справа от метки «Выберите токен/смарткарту»:



Здесь все просто. Выбираем файл с ASN1-структурой, указываем в каком он формате, решаем нужны ли нам дополнительные подробности и нажимаем кнопку «Просмотр ASN1-файла»:



Сравнивая правый и левый скриншоты, можно воочию видеть какую дополнительную информацию можно получить при нажатой кнопке «Дополнительная информация». Для сохранения структуры в разобранном виде достаточно нажать кнопку «Сохранить».

Если зажать левую клавишу мыши, то можно выделить интересующий нас блок. И, если теперь на выделенном блоке, нажать правую клавишу мыши, то появится меню со следующими пунктами:

  • копировать в буфер обмена;
  • просмотреть выделенный блок.

И если выбрать пункт «Просмотреть выделенный блок», то появится окно с распарсенным блоком:



Если же нажать кнопку «копировать в буфер обмена», то выделенный блок будет скопирован в буфер обмена. Буфер обмена можно будет просмотреть, нажав кнопку «ASN1-буфера обмена». Пользователь может сам положить данные в буфер обмена своими средствами, а потом здесь их просмотреть.

И поскольку утилита часто обновляется, то добавлена возможность получения новых версий утилиты непосредственно из нею. Для этого достаточно навести курсор мыши на поле «PKCS#11, x509v3, PKCS#10, PKCS#7, CMS, PKCS#12, ASN1», нажать правую кнопку мыши и выбрать в появившемся меню пункт «О программе». В появившемся окне достаточно выбрать платформу и нажать левую клавишу мыши:



При успешном получении дистрибутива вы получите соответствующее сообщение о том, где сохранен полученный архив:



P.S. Для тех кто в первый раз хочет получить утилиты, это по-прежнему можно сделать здесь:

Дистрибутивы для Linux, OS X и Windows
Tags: pkcs pkcs#11 pkcs7 pkcs#10 pkcs#12 cms x509 v3 tcl/tk python
Hubs: Cryptography Python Desktop environments IT Standards Development for Linux
+5
1.1k 26
Comments 9
Ads