Пакет 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 имеет встроенное хранилище, которое включает в свой состав три базы данных:
В первой базе данных cert8.db хранятся корневые сертификаты и, как правило, сертификаты сторонних пользователей, которые используются, например, для шифрования электронной почты или файлов на сертификате получателя. В БД key3.db хранятся закрытые ключи. И, наконец, в БД secmod.db хранится информация о подключаемых токенах/смарткартах с интерфейсом PKCS#11. Управляет этой базой утилита modutil, которая позволяет добавить или удалить модуль PKCS#11. Подключение модуля заключается в указании пути к библиотеке PKCS#11 модуля и задании его nickname. Указание пути к каталогу, в котором размещается хранилище, является неотъемлемым параметром любой утилиты NSS. В одних утилитах он задается как «-d <каталог хранилища NSS>», в других как «-dbdir <каталог хранилища NSS>». Создается хранилише утилитой modutil:
Отметим, что такие хранилища есть во всех проектах, построенных на NSS, включая Firefox, Thunderbird, Seamonkey.
В статье было выражено пожелание написать графические оболочки для утилит командной строки OpenSSL и NSS. И вот настала пора для NSS. Первый вопрос: в какой среде разрабатывать? В предыдущих статьях была рассмотрена разработка пользовательского графического интерфейса в среде Tcl/Tk с использованием различных конструкторов. Разработку графического пользовательского интерфейса для пакета NSS было решено вести на скриптовом языке Python. В качестве графического пакета в целях обеспечения преемственности с пакетом Tk был выбран пакет Tkinter.
Теперь необходимо было выбрать инструментарий для проектирования графического интерфейса. Первым был рассмотрен пакет Rapid-TK :
В целом пакет оставил хорошее впечатление, которое оправдывает свое название пакета: Rapid – быстрый. И все же отметим два недостатка. Первое неодобство связано с тем, что на мольберте размещаются только иконки виджетов, а не сами виджеты (см. рис.). И чтобы увидеть реальную картинку, приходится очень часто выполнять проект. Второй недостаток связан с размещением виджетов в окне. В Rapid-TK в качестве упаковщика используется упаковщик Pack (размещение по направлениям), что очень затрудняет выравнивание виджетов в окне в отличие от упаковщиков grid (по сетке, аналогично морскому бою) и place (по координатам). Хотя использование frame позволяет добиться нужного эффекта:
Однако после начала проектирования стало ясно, что количество виджетов и окон в проекте растет и оптимальным стало бы использование технологии Notebook (блокнот, записная книжка):
И тут ждал неприятный сюрприз: конструктор Rapid-TK не поддерживает работу с Notebook, хотя сам виджет подключается. И тогда был найден констуктор Page – автоматический генератор GUI для Python. Совсем неожиданным и приятным сюрпризом было то, что констуктор Page построен на базе Visual Tcl . Это и стало самым весомым аргументом:
Если приглядеться, то окна конструктора Page как близнецы окон констуктора Visual Tcl. И все же без подвоха не обошлось: создаваемый генератором скрипт на Python не хотел выполняться из-за использования «великого, могучего, правдивого и свободного русского языка!» (И.С. Тургенев). Но все разрешилось просто, достаточно оказалось добавить в файл gui_pyton_gen.tcl после 418 строки следующий код:
Теперь, если заглянуть в генерируемый код на Python, то второй строкой в нем окажется эта директива:
Что еще? Констуктор Page не предполагает, что проект будет многооконным (см. выше Rapid). В нашем случае многооконность, с одной стороны, заменена на Notebook. А с другой, в первую очередь это касается ввода PIN-кода или пароля, мы использовали виджет Labelframe, который то скрывался (self1.LabelPSW6.place_forget()):
то появлялся для ввода PIN-кода или пароля:
И все же дополнительное окно потребовалось, например, для просмотра содержимого сертификата из базы данных или электронной подписи:
В данном случае задача решается просто. Создается новый проект в конструкторе Page и полученный код «ручками» включается в основную ветку. Чтобы увидеть все хитросплетения разработки графического пользовательского интерфейса для утилит командной строки в Python на Tkinter, достаточно установить конструктор Page, загрузить проект nss_my и внимательно его проанализировать. В качестве возможностей данного проекта приведем скриншот извлечения оригинала файла из файла с присоединенной подписью (утилита p7content):
И наконец, мы хотим на выходе получить не скрипт на Python, а бинарный код. Для этого мы использовали проект Nuitka, который скрипт на Python конвертирует в C-код, а затем транслирует. Эффект превзошел все ожидания. Поставьте пакет Nuitka, положите в папку bin сгенерированные конструктором Page два Python-овских скрипта nss_my.py и nss_my_support.py и выполните команду:
В итоге вы получите бинарный модуль nss_my.exe. Пусть вас не смущает окончание, смело запускайте его. В качестве подключаемого модуля 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 :
В целом пакет оставил хорошее впечатление, которое оправдывает свое название пакета: Rapid – быстрый. И все же отметим два недостатка. Первое неодобство связано с тем, что на мольберте размещаются только иконки виджетов, а не сами виджеты (см. рис.). И чтобы увидеть реальную картинку, приходится очень часто выполнять проект. Второй недостаток связан с размещением виджетов в окне. В Rapid-TK в качестве упаковщика используется упаковщик Pack (размещение по направлениям), что очень затрудняет выравнивание виджетов в окне в отличие от упаковщиков grid (по сетке, аналогично морскому бою) и place (по координатам). Хотя использование frame позволяет добиться нужного эффекта:
Однако после начала проектирования стало ясно, что количество виджетов и окон в проекте растет и оптимальным стало бы использование технологии Notebook (блокнот, записная книжка):
И тут ждал неприятный сюрприз: конструктор Rapid-TK не поддерживает работу с Notebook, хотя сам виджет подключается. И тогда был найден констуктор Page – автоматический генератор GUI для Python. Совсем неожиданным и приятным сюрпризом было то, что констуктор Page построен на базе Visual Tcl . Это и стало самым весомым аргументом:
Если приглядеться, то окна конструктора 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()):
то появлялся для ввода PIN-кода или пароля:
self1.LabelPSW6.place(relx=0.05, rely=0.59, relheight=0.3, relwidth=0.88)
И все же дополнительное окно потребовалось, например, для просмотра содержимого сертификата из базы данных или электронной подписи:
В данном случае задача решается просто. Создается новый проект в конструкторе Page и полученный код «ручками» включается в основную ветку. Чтобы увидеть все хитросплетения разработки графического пользовательского интерфейса для утилит командной строки в Python на Tkinter, достаточно установить конструктор Page, загрузить проект nss_my и внимательно его проанализировать. В качестве возможностей данного проекта приведем скриншот извлечения оригинала файла из файла с присоединенной подписью (утилита p7content):
И наконец, мы хотим на выходе получить не скрипт на 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, по крайней мере на этапе тестирования, удобно использовать облачный токен.