Сказання про Клеопатрі і про російської криптографії (Продовження)

imageЗ появою бібліотеки GCrypt-1.7.0 з підтримкою російської криптографії (ГОСТ 28147-89, ГОСТ Р 34.11-94/2012 і ГОСТ Р 34.10-2001/2012), стало можливим говорити про підтримку російського PKI в таких проектах як Kleopatra і KMail.

imageKMail – це поштовий клієнт, що для забезпечення безпеки листування дозволяє підписувати і шифрувати повідомлення за протоколом S/MIME. І те й інше базується на архітектурі PKI, сертифікатів X509 і протоколах CMS/PKCS#7:

image

imageKleopatpa – це графічна утиліта, яка дозволяє не тільки підписувати і шифрувати файли, але і забезпечує зберігання та керування сертифікатами і закритими ключами:

image

imageІ Kleopatpa і KMail не мають вбудованої криптографії: всі криптографічні перетворення для них робить їх свита і насамперед модуль gpgsm з пакету GnuPg. Для криптографічних обчислень використовується бібліотека LibGCrypt. А для розбору сертифікатів X509, підписаних або зашифрованих повідомлень (CMS/PKCS#7, PKCS#10 і т. п.) використовується бібліотека libksba. Згадаємо ще бібліотеку libgpgme, але про її ролі трохи пізніше.

І якщо сама Kleopatpa і її вірний слуга KMail нічого проти російської криптографії не мають, то їх свита, за винятком LibGCrypt, навідріз відмовляється з нею дружити.

Почнемо з самого простого члена почту, а саме з бібліотеки libgpgme. Для початку подивимося вихідний код підписаного повідомлення:

image

В полі «Content-Type» є змінна micalg, в якій зазначається тип хеша, використовуваного при формуванні або перевірці підпису. Для багатьох поштових клієнтів, у тому числі і для KMail, відсутність значення в цьому полі ніяк не впливає на перевірку електронного підпису, але тільки не для Thunderbird і Mozilla. Тому бажано, щоб це поле і KMail-му заповнювалося. Тим більше, що для цього будуть потрібні мінімальні зусилля. Все, що необхідно додати в файл gpgme.h.in номери російських хеш-алгоритмів:

/* Hash algorithms (match the values from those libgcrypt). */
typedef enum
{
GPGME_MD_NONE = 0,
. . .
GPGME_MD_CRC24_RFC2440 = 304,
/*Додано from gcrypt.h.in !!!!*/
GPGME_MD_GOSTR3411_94 = 308, /* GOST R 34.11-94 */
GPGME_MD_STRIBOG256 = 309, /* GOST R 34.11-2012, 256 bit. */
GPGME_MD_STRIBOG512 = 310, /* GOST R 34.11-2012, 512 bit. */
GPSME_MD_GOSTR3411_CP = 311 , /* GOST R 34.11-94 with CryptoPro-A S-Box. */ }
gpgme_hash_algo_t;

Причому ці номери мають строго корелювати з відповідними номерами з файлу gcrypt.h.in бібліотеки libgcrypt:

/************************************
* Cryptograhic Hash Functions *
************************************/

/* Algorithm IDs for the hash functions we know about. Not all of them
are implemented. */
enum gcry_md_algos
{
GCRY_MD_NONE = 0,
. . 
GCRY_MD_TIGER2 = 307, /* TIGER2 variant. */
/*Російські хеш алгоритми*/
GCRY_MD_GOSTR3411_94 = 308, /* GOST R 34.11-94. */
GCRY_MD_STRIBOG256 = 309, /* GOST R 34.11-2012, 256 bit. */
GCRY_MD_STRIBOG512 = 310, /* GOST R 34.11-2012, 512 bit. */
GCRY_MD_GOSTR3411_CP = 311, /* GOST R 34.11-94 with CryptoPro-A S-Box. */
. . .
GCRY_MD_SHAKE256 = 317
};

Ось і все, бібліотека libgpgme встала на бік російської криптографії.

imageОсновна доопрацювання припала на GnuPg (модуль gpg-protect-tool), який відповідає, зокрема, за імпорт особистих сертифікатів X509 із захищеного контейнера PKCS#12, модуль gpgsm, який, зокрема, відповідає за формування і розбір сертифікатів, підписаних і зашифрованих повідомлень (CMS, PKCS#7) і його підмайстер бібліотеку libksba.

Риторичне питання – де взяти особистий сертифікат, тобто сертифікат X509 і закритий ключ? Але сьогодні з цим питань немає, звичайно в Засвідчувальному Центрі (УЦ). Сьогодні в Росії зареєстровані тільки в Мінкомзв'язку не одна сотня УЦ. Однак треба пам'ятати, що це послуга платна! Для тестування (і навіть внутрішньокорпоративного захищеного документообігу, включаючи поштову листування) особисті сертифікати в захищеному контейнері PKCS#12 можна отримати за допомогою утиліти openssl, або на одному з безкоштовних тестових УЦ. Тут же можна отримати особистий сертифікат відразу в контейнері PKCS#12.

imageДля імпорту особистого сертифіката в середу Клеопатри (правильніше сказати в сховище сертифікатів і закритих ключів у GnuPg) необхідно наявний особистий сертифікат вивантажити (експортувати) в контейнер PKCS#12. При цьому може виявитися, що контейнер був сформований у відповідності з вимогами ТК-26. В даний час (підкреслюємо, що в даний час) GnuPg не ладнає з контейнерами PKCS#12 сформованими за вимогами ТК-26, але це і не страшно. Маючи під рукою утиліту openssl (а ще краще утиліту lirssl), ми швидко позбавляємося від цього недоліку, випустивши новий контейнер з допомогою простого скрипта:

#cat CONVERT_P12_for_GPGSM.sh

# у файлі /etc/ssl/openssl.cnf повинен бути подкючен ГОСТ-ий engine
export OPENSSL_CONF=/etc/ssl/openssl.cnf
openssl pkcs12 -in $1.p12 -nodes -out $1.txt.p12 -nomacver
openssl pkcs12 -export -in $1.txt.p12 -nodes -out $1\_openssl_cert_key.p12
rm –f $1.txt.p12
echo "Файл для імпорту в GPGSM: $1\_openssl_cert_key.p12"
#

#sh CONVERT_P12_for_GPGSM.sh фт-2001-2016
Enter Import Password:
Enter Export Password:
Verifying - Enter Export Password:
Файл для імпорту в GPGSM: фт-2001-2016_openssl_cert_key.p12
#

Тепер у нас є контейнер PKCS#12, який ми і будемо імпортувати:

image

Після натискання кнопки «Відкрити» буде запропоновано ввести пароль для розбору контейнера PKCS#12:

image

А потім буде запропоновано ввести і підтвердити пароль, за яким буде здійснюватися доступ до закритого ключа імпортованого сертифіката:

image

Все, особистий сертифікат імпортований. Сторонні сертифікати, а також кореневі сертифікати, що імпортуються як з формату DER, так і формату PEM.

Тепер, коли Kleopatra володіє сертифікатами, вона може своїм особистим сертифікатом підписувати документи:

image

вводячи пароль для доступу до закритого ключа:

image

Конфіденційні файли можна шифрувати з використанням сертифіката одержувача:

image

При створенні CMC/PKCS#7 з шифруванням для формування ключа шифрування ключів (КЕК) з допомогою закритого ключа, відповідного ключа originatorKey publicKey, і відкритого ключа отримувача, застосовується алгоритм VKO GOST R 34.10-2012. На жаль, в поточній версії GCrypt відсутня реалізація даного алгоритму. Реалізація даного алгоритму була запозичена з бібліотеки LCC-2016 і додана в файл ecc-gost.c.

І так, сміливо натискаємо кнопку Продовжити:

image

Що стосується поштового клієнта KMail, то для того, щоб захистити листування (електронний підпис, шифрування), насамперед треба вибрати особистий сертифікат (сертифікат, у якого є закритий ключ), яким ви будете підписувати поштові повідомлення, а також сертифікат, який буде брати участь у шифрування листів:

image

Натисніть кнопку Запустити диспетчер сертифікатів»: до ваших послуг буде Клеопатра і ви зможете детально переглянути властивості вибраного сертифіката.

Тепер можна як підписувати, так і шифрувати поштові повідомлення:

image

Після натискання «Надіслати» KMail попросить підтвердити факт шифрування:

image

І попросить ввести пароль для доступу до закритого ключа:

image

imageАле хочеться більшого. Мова йде про використання програмно-апаратних токенів PKCS#11 з підтримкою тієї ж російської криптографії. Для підключення тоненов PKCS#11 необхідно встановити в систему доопрацьований модуль gnu-pkcs11-scd, а в конфігураційний файл gpg-agent.conf додати наступні рядки:

scdaemon-program /usr/local/bin64/gnupg-pkcs11-scd
pinentry-program /usr/bin/pinentry-qt

Після цього необхідно в конфігураційному файлі gnu-pkcs11-scd.conf вказати бібліотеки PKCS#11 для токенів, які будуть використовуватися:

#В прикладі припускається використання програмно-апаратного токена #LS11USB2016
#з бібліотекою /usr/local/lib64/libls11usb2016.so
...
# Comma-separated list of available provider names. Then set
# attributes for each provider using the provider-[name]-attribute
# syntax.
providers libls11usb2016
provider-libls11usb2016-library /usr/local/lib64/libls11usb2016.so
provider-libls11usb2016-cert-private
...


Переконайтеся, що gpg-agent запущено:

$ gpg-agent --daemon --use-standard-socket
GPG_AGENT_INFO=/home/a513/.gnupg/S. gpg-agent:19092:1; export GPG_AGENT_INFO;
$

Тепер після запуску Kleopatra або KMail, буде потрібно ввести PIN-код для доступу до токена:

image

Перевірити ім'я токена, можна скориставшись вільно поширюваної утилітою p11conf :

$ /usr/local/bin64/p11conf -A /usr/local/lib64/libls11usb2016.so -h
usage: /usr/local/bin64/p11conf [-hitsmIupPred] -A APIpath [-c slotID -U userPin -S SOPin -n newPin -L label]
-h display usage
-i display PKCS#11 library info
-s display slot(s) info (-c slotID is optional)
-t display token(s) info (-c slotID is optional)
Others must use -c slotID
-m display list mechanism
-I initialize token 
-u initialize user PIN
-p set the user PIN
-P set the SO PIN
-r remove all objects
-e enumerate objects
-d dump all object attributes
Copyright© 2011-2016
bash-4.3$

Для перегляду импормации про токені достатньо виконати наступну команду:

image

Після успішного введення PIN-коду, буде отриманий весь список сертифікатів, як зі сховища GnuGPG, так і зберігаються на підключених токенах/смарт-картах PKCS#11:

image

Більше того, тепер використовувати російську криптографію в S/MIME для підписання та шифрування листування можуть використовувати і інші поштові клієнти (наприклад, Claws, Evolution), які використовують для цього мехамизмы GnuPg/SMIME:

image

image

imageОсь і все – Kleopatra і її королівська свита сумлінно служать російської криптографії!

Що далі?

imageА далі сподіваємося, що в ближній перспективі Kleopatra також буде формувати запити PKCS#10 ГОСТ Р 34,10-2001/2012:

image
які потім можна буде передавати у Засвідчувальні Центри і в підсумку отримувати сертифікати.

Але це буде інша розмова.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.