в начало  предыдущее  закрыть  следущее  в конец
141090, Московская область, г.Королев, мкр.Юбилейный, ул. Ленинская, д.4, пом.7
Телефон: +7(495) 589-99-53, e-mail: support@lissi.ru
Главная страница / Статьи / Kleopatra, KMail, GnuPg и российская криптография

GnuPg-2, Kleopatra, KMail и российская криптография

(Вся королевская рать: Клеопатра на службе российской криптографии)



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

KMail – это почтовый клиент, который для обеспечения безопасности переписки позволяет подписывать и шифровать сообщения. И то и другое базируется на архитектуре PKI , сертификатах X509 и протоколах CMS/PKCS#7:
  Kleopatpa – это графическая утилита, которая не только позволяет подписывать и шифровать файлы, но и обеспечивает хранение и управление сертификатами X509 и закрытыми ключами:
  И Kleopatpa и KMail не имеют встроенной криптографии: все криптографические преобразования для них делает их свита и прежде всего модуль gpgsm из пакета GnuPg. Для криптографических вычислений используется библиотека GCrypt. А для разбора сертификатов X509, подписанных или зашифрованных сообщений (CMS/PKCS#7, PKCS#10 и т.п.) используется библиотека KSBA. Упомянем еще библиотеку GPGME, но о ее роли чуть позже. И если сама Kleopatpa и ее верный слуга KMail ничего против российской криптографии не имеют, то их свита, за исключением GCrypt, на отрез отказываются с ней дружить. Начнем с самого безобидного члена свиты, а именно с библиотеки gpgme. Для начала посмотрим исходный код подписанного сообщения:
  В поле «Content-Type» есть переменная micalg, в которой указывается тип хэша, используемого при формировании или проверки подписи. Для многих почтовых клиентов, в том числе и для KMail, отсутствие значение в этом поле никак не влияет на проверку электронной подписи, то только не для Thunderbird и Seamonkey. Поэтому желательно, чтобы это поле и KMail заполнялось. Тем более, что для этого потребуются минимальные усилия. Все, что необходимо это добавить в файл gpgme.h.in номера российских хэш-алгоритмов :
/* Hash algorithms (the values match those from 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. */               
                          GPG ME_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 библиотеки gcrypt:
 /***********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 };
 
После этого достаточно внести изменения в функцию gpgme_hash_algo_name (файл gpgme.c), связанные с обработкой российских хэш-функций:

const char *gpgme_hash_algo_name (gpgme_hash_algo_t algo) { switch (algo) {
         case GPGME_MD_MD5: return "MD5";
                     . . .
          case GPGME_MD_CRC24_RFC2440: return "CRC24RFC2440";
         /*Добавлена обработка российских хэш функций*/
          case GPGME_MD_GOSTR3411_94: /* GOST R 34.11-94. TK26 param Z*/
                         return "gostr3411-94-TC26";
          case GPGME_MD_STRIBOG256: /* GOST R 34.11-2012, 256 bit. */
                         return "gostr3411-12-256";
          case GPGME_MD_STRIBOG512: /* GOST R 34.11-2012, 512 bit. */
                         return "gostr3411-12-512";
          case GPSME_MD_GOSTR3411_CP: /* GOST R 34.11-94. CriptoPro param A */
                         return "gostr3411-94";
          default: return NULL; } }

 
Вот и все, библиотека gpgme встала на сторону российской криптографии. Основная доработка пришлась на GnuPg (модуль gpg-protect-tool, который отвечает, в частности, за импорт личных сертификатов X509 из защищенного контейнера PKCS#12, модуль gpgsm, который в частности, отвечает за формирование и разбор сертификатов, подписанных и зашифрованных сообщений (CMS, PKCS#7) и его подмастерье библиотеку KSBA. Риторический вопрос – где взять личный сертификат, т.е. сертификат X509 и закрытый ключ? Но сегодня с этим вопросов нет, конечно в Удостоверяющем Центре (УЦ). Сегодня в России зарегистрированных только в Минкомсвязи не одна сотня УЦ. Однако надо помнить, что это услуга платная! Для тестирования (и даже внутрикорпоративного защищенного документооборота, включая почтовую переписку) личные сертификаты в защищенном контейнере PKCS#12 можно получить с помощью утилиты openssl, либо на одном из тестовых (бесплатных) УЦ. Здесь же можно получить личный сертификат сразу в контейнере PKCS#12. Для импорта личного сертификата в среду Клеопатры (правильнее сказать в хранилище сертификатов и закрытых ключей в GnuPg), необходимо имеющийся личный сертификат выгрузить (экспортировать) в контейнер PKCS#12. При этом может оказаться, что контейнер был сформирован в соответствии с требованиями ТК-26. В настоящее время (подчеркиваю, в настоящее время) GnuPg не ладит с контейнерами PKCS#12 сформированными по этим требованиям, но это и не страшно. Имея под рукой утилиту openssl, мы быстро избавляемся от этого недостатка, выпустив новый контейнер с помощью простого скрипта:

#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, который мы и будем импортировать:
  После нажатия кнопки «Открыть» будет предложено ввести пароль для разбора контейнера PKCS#12:
  А затем будет предложено ввести и подтвердить пароль, по которому будет осуществляться доступ к закрытому ключу импортированного сертификата:
  Все личный сертификат импортирован. Сторонние сертификаты, а также корневые сертификаты, импортируются как из формата DER, так и формата PEM. Теперь, когда Клеопатра владеет сертификатами, она может своим личным сертификатом подписывать документы:
 
  А отправляя конфиденциальные послания, шифровать их с использованием сертификата получателя:
  При создании CMC/PKCS#7 с шифрованием для формирования ключа шифрования ключей (КЕК) с помощью закрытого ключа, соответствующего ключу originatorKey publicKey, и открытому ключу получателя, применяется алгоритм VKO GOST R 34.10-2012. К сожалению в текущей версии GCrypt отсутствует (или я пропустил) реализация данного алгоритма. Реализация данного алгоритма была заимствована из библиотеки LCC-2016 и добавлена в файл ecc-gost.c. И так, смело нажимаем кнопку «Продолжить»:
  Что касается почтового клиента KMail, то для того, чтобы защитить переписку (электронная подпись, шифрование), всего надо выбрать личный сертификат (сертификат, у которого есть закрытый ключ), которым вы будете подписывать почтовые сообщения, а также сертификат, который будет участвовать в шифровании писем:
  Нажав кнопку «Запустить диспетчер сертификатов» к вашим услугам будет Клеопатра и вы сможете подробно просмотреть свойства выбираемого сертификата. Теперь вы можете как подписывать, так и шифровать ваши почтовые сообщения:
  После нажатия клавиши «Отправить» KMail запросит подтвердить факт шифрования:
  И запросит ввести пароль для доступа к закрытому ключу:
  Вот и все – вся королевская рать Клеопатры добросовестно служит российской криптографии!!! Но хочется большего – впереди подключение программно-аппаратных токенов PKCS#11 с поддержкой все той же российской криптографии
  и формирование Клеопатрой запросов на сертификаты X509 в формате PKCS#10:
 
© 2002-2017. ООО "ЛИССИ-Софт". Все права защищены
Телефон: +7(495) 589-99-53, e-mail: support@lissi.ru