Тестируя облачный токен на различных платформах, меня не покидала мысль о некой несправедливости: почему утилиты конфигурирования токенов PKCS#11 на платформе MS Windows имеют графический интерфейс, а для других платформ его нет. И в первую очередь это касается базовой утилиты p11conf, которая доступна для свободного использования, и является утилитой командной строки, взаимодействие с которой осуществляется через стандартный ввод/вывод.
tkBuilder – графический конструктор
Выходом могло бы быть написание на языке C/C++ GUI для утилиты p11conf, например, с использование библиотеки Qt. Но тут в памяти всплыло, что есть скриптовый язык высокого яровня Tcl (Tool Command Language), который в связке с графической библиотекой Tk (Tool Kit), и позволяет быстро создавать графические интерфейсы для консольных программ или утилит командной строки. Впервые я познакомился с пакетом Tk/Tcl в далеком 1997 году, когда планировалось на нем написать графический интерфейс для системы контроля доступа (СКД). Тогда графические возможности пакета произвели сильное впечатление и, в частности, tetris:
Одной из причин, по которой отказались, от использования Tk/Tcl, было отсутствие для него в то время конструктора (дизайнера) аналогичного сегодняшнему, скажем, QT-designer. Освежив в памяти возможности Tk/Tcl, а нас интересовало, помимо графических возможностей, организация взаимодействия с утилитами командной строки, и убедившись, что мы стоим на правильном пути, мы принялись за поиск конструктора. После проведенного анализа имеющихся конструкторов, выбор пал на дизайнер tkBuilder_for_tcl8.4:
Дальнейшая разработка показала правильность выбора. Конструктор оказался не только с понятным интерфейсом, но обладает отличными функциональными возможностями. Он позволяет в ходе разработки следить отлаживать проект не только целиком:
но также контролировать его отдельные части:
Разработчик всегда может посмотреть и код всего проекта или его части:
Взаимодействие с утилитой командой строки, для которой разрабатывается графическая оболочка, ведется по программному каналу:
Когда проект завершен, то необходимо его сохранить в итоговом tcl файле:
О ложках дегтя
Казалось бы все, бери и запускай утилиту. Но без ложки (на самом деле двух ложек) дегтя нельзя. Первая ложка связана с формированием у виджетов (в нашем случае у виджета text) команд xScrollCommand и yScrollComand., а именно:
text .fr1.fr2_list -background #ffffff
-yscrollcommand [list .fr1.ysc set] -xscrollcommand [list .fr1.scx set]
Не хотят они попадать в итоговый файл. В итоге их пришлось прописывать ручками. Ну и вторая ложка дегтя классическая. Дизайнер tkBuilder_for_tcl8.4 отказывается работать с русскими буквами (можеть я чего не доглядел). Подчеркиваю это касается только дизайнера и не касается Tk/Tcl, для которого русский язык как дом родной. Здесь тоже пришлось поработать ручками:
#!/bin/sh
# the next line restarts using wish
exec wish8.5 "$0" ${1+"$@"}
wm title . "GUI P11CONF"
global p11conf
global libpkcs11
set res ""
set libpkcs11 ""
set p11conf "/usr/local/bin64/p11conf"
. configure -background #18f1d7
frame .fr1 -background #18f1d7
grid .fr1 -column 0 -row 0
button .fr1.b1 -command {InitTok . .fr1.fr2_list;} -padx 1 -text "Инициализировать" -width 24
grid .fr1.b1 -column 0 -row 0
button .fr1.b2 -command {ChangeUserPin . .fr1.fr2_list; } -padx 1 -text "Сменить USER PIN" -width 24
grid .fr1.b2 -column 0 -row 1
button .fr1.b6_3 -command {ChangeSOPin . .fr1.fr2_list "SO"; } -padx 1 -text "Сменить SO PIN" -width 24
grid .fr1.b6_3 -column 0 -row 2
button .fr1.b7 -command {InfoObj . .fr1.fr2_list "Obj"; } -padx 1 -text "Просмотреть объекты" -width 24
grid .fr1.b7 -column 0 -row 3
button .fr1.b8 -command {InfoObj . .fr1.fr2_list "Clear";} -padx 1 -text "Удалить все объекты" -width 24
grid .fr1.b8 -column 0 -row 4
button .fr1.b9_6 -command {InfoToken . .fr1.fr2_list; } -padx 1 -text "Информация о токене" -width 24
grid .fr1.b9_6 -column 0 -row 5
button .fr1.b0 -command {InfoMech . .fr1.fr2_list;} -padx 1 -text "Поддерживаемые механизмы" -width 24
grid .fr1.b0 -column 0 -row 6
button .fr1.b3_8 -command {ChangeSOPin . .fr1.fr2_list "Deblock"; } -padx 1 -text "Разблоктровать USER PIN" -width 24
grid .fr1.b3_8 -column 0 -row 7
button .fr1.b4_9 -command {InfoDump . .fr1.fr2_list; } -padx 1 -text "DUMP всех объектов" -width 24
grid .fr1.b4_9 -column 0 -row 8
button .fr1.b5_10 -command {exit} -text "Выход" -width 10
В итоге мы получили поддержку графического интерфейса для утилиты командной строки p11conf через утилиту GUITKP11Conf.tcl:
bash-4.3$ ./GUITKP11Conf.tcl
Теперь смело можно работать с токенами PKCS#11, в том числе и с облачным токеном LIBLS11CLOUD, например, просмотреть какие объекты хранятся на нем:
Файл проекта GUIP11CONF.tkb и утилиту GUIP11CONF.tcl скачать можно здесь. Утилиту p11conf для различных платформ можно скачать здесь. Маленькое замечание. В утилите GUIP11CONF.tcl прописан путь в утилите p11conf (см. выше):
global p11conf
…
set p11conf "/usr/local/bin64/p11conf"
Скорее всего вам придется поправить путь к утилите p11conf с учетом вашей конфигурации.
Лиха беда начало
В заключение отмечу, что аппетит приходит во время еды, и уже есть желание написать аналогичные графические оболочки для таких утилит командной строки как openssl/lirssl (ССЫЛКА ) или утилит NSS (Network Security Services). Как говорится, лиха беда начало.
Автор: Орлов Владимир Николаевич