Python и графический интерфейс для утилит командной строки Network Security Services

    imageПакет Network Security Services (NSS) представляет собой набор библиотек, используемых при кроссплатформенной разработке защищенных клиентских и серверных приложений. Приложения построенные с использование NSS могут использовать TLS от v1.0 до TLS v1.3, PKCS #5, PKCS #7, CMS, PKCS #11, PKCS #12, S/MIME, сертификаты X.509 v3, OCSP и другие стандарты обеспечения безопасности. По своей функциональной мощности в области криптографии и PKI с NSS может сравниться разве что OpenSSL. Но при этом пакет NSS имеет одно неоспоримое преимущество перед OpenSSL, а именно имеет хранилище, в котором хранятся корневые сертификаты, сертификаты сторонних пользователей, информация о подключенных аппаратных ускорителях, токенах, смарткартах с интерфейсом PKCS#11.

    В настоящее время пакет NSS поддерживает стандарт PKCS#11 v.2.40.

    В разработку NSS внесли свой вклад AOL, Red Hat, Sun Microsystems / Корпорация Oracle, Google и другие компании и индивидуальные вкладчики. Mozilla предоставила хранилище для исходного кода.

    Пакет NSS широко используется, в том числе в продуктах Mozilla, включая браузер Firefox (в том числе и на платформе Android), почтовый клиент Thunderbird и интегрированный пакет Seamonkey.

    Пакет NSS, также как и OpenSSL, предоставляет возможность использования для реализации различных функций PKI (генерация ключей, выпуск сертификатов x509v3, работа с электронной подписью, поддержка TLS и т.д.) утилиты командной строки. В отличие от OpenSSL, где функции PKI реализуются одной утилитой openssl, пакет NSS предоставляет целый набор утилит. Так для работы с сертификатами имеется утилита certutil, для работы с защищенными контейнерами PKCS#12 используется утилита pk12util, для работы с электронной подписью используются утилиты p7sign, p7verify, p7content и т.д. Если говорить об операционных системах семейства Linux, то пакет NSS входит в обязательную поставку и все эти утилиты предустановлены.

    Как уже говорилось, NSS имеет встроенное хранилище, которое включает в свой состав три базы данных:

    bash-4.3$ ls -l *.db 
    cert8.db 
    key3.db 
    secmod.db 
    bash-4.3$

    В первой базе данных cert8.db хранятся корневые сертификаты и, как правило, сертификаты сторонних пользователей, которые используются, например, для шифрования электронной почты или файлов на сертификате получателя. В БД key3.db хранятся закрытые ключи. И, наконец, в БД secmod.db хранится информация о подключаемых токенах/смарткартах с интерфейсом PKCS#11. Управляет этой базой утилита modutil, которая позволяет добавить или удалить модуль PKCS#11. Подключение модуля заключается в указании пути к библиотеке PKCS#11 модуля и задании его nickname. Указание пути к каталогу, в котором размещается хранилище, является неотъемлемым параметром любой утилиты NSS. В одних утилитах он задается как «-d <каталог хранилища NSS>», в других как «-dbdir <каталог хранилища NSS>». Создается хранилише утилитой modutil:

    #modutil –create –dbdir  < каталог хранилища NSS >

    Отметим, что такие хранилища есть во всех проектах, построенных на NSS, включая Firefox, Thunderbird, Seamonkey.

    В статье было выражено пожелание написать графические оболочки для утилит командной строки OpenSSL и NSS. И вот настала пора для NSS. Первый вопрос: в какой среде разрабатывать? В предыдущих статьях была рассмотрена разработка пользовательского графического интерфейса в среде Tcl/Tk с использованием различных конструкторов. Разработку графического пользовательского интерфейса для пакета NSS было решено вести на скриптовом языке Python. В качестве графического пакета в целях обеспечения преемственности с пакетом Tk был выбран пакет Tkinter.

    Теперь необходимо было выбрать инструментарий для проектирования графического интерфейса. Первым был рассмотрен пакет Rapid-TK :

    image

    В целом пакет оставил хорошее впечатление, которое оправдывает свое название пакета: Rapid – быстрый. И все же отметим два недостатка. Первое неодобство связано с тем, что на мольберте размещаются только иконки виджетов, а не сами виджеты (см. рис.). И чтобы увидеть реальную картинку, приходится очень часто выполнять проект. Второй недостаток связан с размещением виджетов в окне. В Rapid-TK в качестве упаковщика используется упаковщик Pack (размещение по направлениям), что очень затрудняет выравнивание виджетов в окне в отличие от упаковщиков grid (по сетке, аналогично морскому бою) и place (по координатам). Хотя использование frame позволяет добиться нужного эффекта:

    image

    Однако после начала проектирования стало ясно, что количество виджетов и окон в проекте растет и оптимальным стало бы использование технологии Notebook (блокнот, записная книжка):

    image

    И тут ждал неприятный сюрприз: конструктор Rapid-TK не поддерживает работу с Notebook, хотя сам виджет подключается. И тогда был найден констуктор Page – автоматический генератор GUI для Python. Совсем неожиданным и приятным сюрпризом было то, что констуктор Page построен на базе Visual Tcl . Это и стало самым весомым аргументом:

    image

    Если приглядеться, то окна конструктора Page как близнецы окон констуктора Visual Tcl. И все же без подвоха не обошлось: создаваемый генератором скрипт на Python не хотел выполняться из-за использования «великого, могучего, правдивого и свободного русского языка!» (И.С. Тургенев). Но все разрешилось просто, достаточно оказалось добавить в файл gui_pyton_gen.tcl после 418 строки следующий код:

    # -*- coding: utf-8 -*- 	,

    Теперь, если заглянуть в генерируемый код на Python, то второй строкой в нем окажется эта директива:

    ! /usr/bin/env python
    # -*- coding: utf-8 -*- 
    #
    # GUI module generated by PAGE version 4.9
    # In conjunction with Tcl version 8.6
    #    Aug 14, 2017 11:39:19 AM
    import sys
    
    try:
        from Tkinter import *
    except ImportError:
        from tkinter import *
    . . .

    Что еще? Констуктор Page не предполагает, что проект будет многооконным (см. выше Rapid). В нашем случае многооконность, с одной стороны, заменена на Notebook. А с другой, в первую очередь это касается ввода PIN-кода или пароля, мы использовали виджет Labelframe, который то скрывался (self1.LabelPSW6.place_forget()):

    image

    то появлялся для ввода PIN-кода или пароля:

    self1.LabelPSW6.place(relx=0.05, rely=0.59, relheight=0.3, relwidth=0.88)

    И все же дополнительное окно потребовалось, например, для просмотра содержимого сертификата из базы данных или электронной подписи:

    image

    В данном случае задача решается просто. Создается новый проект в конструкторе Page и полученный код «ручками» включается в основную ветку. Чтобы увидеть все хитросплетения разработки графического пользовательского интерфейса для утилит командной строки в Python на Tkinter, достаточно установить конструктор Page, загрузить проект nss_my и внимательно его проанализировать. В качестве возможностей данного проекта приведем скриншот извлечения оригинала файла из файла с присоединенной подписью (утилита p7content):

    image

    И наконец, мы хотим на выходе получить не скрипт на Python, а бинарный код. Для этого мы использовали проект Nuitka, который скрипт на Python конвертирует в C-код, а затем транслирует. Эффект превзошел все ожидания. Поставьте пакет Nuitka, положите в папку bin сгенерированные конструктором Page два Python-овских скрипта nss_my.py и nss_my_support.py и выполните команду:

    #nuitka –recurse-all nss_my.py

    В итоге вы получите бинарный модуль nss_my.exe. Пусть вас не смущает окончание, смело запускайте его. Бинарный код также можно загрузить здесь. В качестве подключаемого модуля PKCS#11, по крайней мере на этапе тестирования, удобно использовать облачный токен.
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 4
    • 0
      Очень даже симпатично!
      • 0
        Первым был рассмотрен пакет Rapid-TK… Первое неодобство связано с тем, что на мольберте размещаются только иконки виджетов, а не сами виджеты (см. рис.).

        Как вы его мягко — «неудобство»… Этим Rapid-TK тогда непонятно вообще как GUI проектировать.

        И тогда был найден констуктор Page – автоматический генератор GUI для Python.

        Вам бы как-то разделить статью. Но мануал хороший получился )
        • 0
          Этим Rapid-TK тогда непонятно вообще как GUI проектировать.

          Вы знаете у меня получилось: иконки виджет на мольберт и запускаешь. Ну а в целом конечно есть неудобство.


          Но мануал хороший получился

          Спасибо

        • 0

          Новую редакцию GUI для NSS, написанную на уже на Tcl/Tk, можно увидеть здесь:
          image

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.