![image](https://habrastorage.org/files/618/cc9/2c7/618cc92c7e074ef4b5e03a834131bffb.png)
![image](https://habrastorage.org/files/0ad/594/f7c/0ad594f7ca684682a460b5c4c9f2cd78.png)
![image](https://habrastorage.org/files/b62/b98/635/b62b98635e02448ea18653a26514177d.png)
![image](https://habrastorage.org/files/726/666/0d7/7266660d74a94d3fb975a67169719f9f.png)
![image](https://habrastorage.org/files/c64/54e/359/c6454e359b614b088ce7e8144f588abb.png)
![image](https://habrastorage.org/files/5fd/3d4/b27/5fd3d4b27bcb4c09a395759cf33919ce.png)
И если сама Kleopatpa и ее верный слуга KMail ничего против российской криптографии не имеют, то их свита, за исключением LibGCrypt, наотрез отказывается с ней дружить.
Начнем с самого безобидного члена свиты, а именно с библиотеки libgpgme. Для начала посмотрим исходный код подписанного сообщения:
![image](https://habrastorage.org/files/de8/614/816/de8614816c4740e99de9ae7a753a0598.png)
В поле «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. */
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](https://habrastorage.org/files/6e3/fb4/d84/6e3fb4d840a04353b5d34c359a16e0e4.png)
Риторический вопрос – где взять личный сертификат, т.е. сертификат X509 и закрытый ключ? Но сегодня с этим вопросов нет, конечно в Удостоверяющем Центре (УЦ). Сегодня в России зарегистрированных только в Минкомсвязи не одна сотня УЦ. Однако надо помнить, что это услуга платная! Для тестирования (и даже внутрикорпоративного защищенного документооборота, включая почтовую переписку) личные сертификаты в защищенном контейнере PKCS#12 можно получить с помощью утилиты openssl, либо на одном из бесплатных тестовых УЦ.
![image](https://habrastorage.org/files/269/e5f/c86/269e5fc869bd4be5b9e56962722b7398.png)
#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](https://habrastorage.org/files/f80/4c2/f1a/f804c2f1a548489b965dac78e7851b0a.png)
После нажатия кнопки «Открыть» будет предложено ввести пароль для разбора контейнера PKCS#12:
![image](https://habrastorage.org/files/fde/13a/3db/fde13a3db0fe45758c9136f88c7a3906.png)
А затем будет предложено ввести и подтвердить пароль, по которому будет осуществляться доступ к закрытому ключу импортированного сертификата:
![image](https://habrastorage.org/files/999/b8c/727/999b8c72786f47269c36c3a8722943bb.png)
Все, личный сертификат импортирован. Сторонние сертификаты, а также корневые сертификаты, импортируются как из формата DER, так и формата PEM.
Теперь, когда Kleopatra владеет сертификатами, она может своим личным сертификатом подписывать документы:
![image](https://habrastorage.org/files/e50/26f/54c/e5026f54c5714c9c836508d34d30d169.png)
вводя пароль для доступа к закрытому ключу:
![image](https://habrastorage.org/files/6aa/cfc/d13/6aacfcd131a640e6bd20149d745f06b1.png)
Конфиденциальные файлы теперь можно шифровать с использованием сертификата получателя:
![image](https://habrastorage.org/files/bb5/3a8/16a/bb53a816a5024883b2364e5f7e2066f7.png)
При создании CMC/PKCS#7 с шифрованием для формирования ключа шифрования ключей (КЕК) с помощью закрытого ключа, соответствующего ключу originatorKey publicKey, и открытому ключу получателя, применяется алгоритм VKO GOST R 34.10-2012. К сожалению, в текущей версии GCrypt отсутствует реализация данного алгоритма. Реализация данного алгоритма была заимствована из библиотеки LCC-2016 и добавлена в файл ecc-gost.c.
И так, смело нажимаем кнопку «Продолжить»:
![image](https://habrastorage.org/files/699/29a/676/69929a676b3946f1957e92dba1067e3d.png)
Что касается почтового клиента KMail, то для того, чтобы защитить переписку (электронная подпись, шифрование), прежде всего надо выбрать личный сертификат (сертификат, у которого есть закрытый ключ), которым вы будете подписывать почтовые сообщения, а также сертификат, который будет участвовать в шифровании писем:
![image](https://habrastorage.org/files/5db/829/75d/5db82975de9b4b08b75af3e0fde442d3.png)
Нажмите кнопку «Запустить диспетчер сертификатов»: к вашим услугам будет Клеопатра и вы сможете подробно просмотреть свойства выбираемого сертификата.
Теперь можно как подписывать, так и шифровать почтовые сообщения:
![image](https://habrastorage.org/files/eda/401/f94/eda401f94c0f4f019266bbc924e6df6e.png)
После нажатия «Отправить» KMail запросит подтвердить факт шифрования:
![image](https://habrastorage.org/files/813/ab2/c24/813ab2c24e20478b86d0bc6c8e7e0be5.png)
И запросит ввести пароль для доступа к закрытому ключу:
![image](https://habrastorage.org/files/b44/3eb/c67/b443ebc67e4343a39b0cdde3c3081663.png)
![image](https://habrastorage.org/files/02a/b0c/073/02ab0c073ecb4442b45ea93785183bfa.png)
scdaemon-program /usr/local/bin64/gnupg-pkcs11-scd
pinentry-program /usr/bin/pinentry-qt
После этого необходимо в конфигурационном файле gnu-pkcs11-scd.conf указать библиотеки PKCS#11 для токенов, которые будут использоваться:
#В примере предполагается использование программно-аппаратного токена
#с библиотекой /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](https://habrastorage.org/files/807/ae8/e6e/807ae8e6e359425682be28e075faa27b.png)
Проверить имя токена, можно воспользовавшись свободно распространяемой утилитой 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 mechanism list
-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(C) 2011-2016
bash-4.3$
Для просмотра импормации о токене достаточно выполнить следующую команду:
![image](https://habrastorage.org/files/e3c/c78/f3c/e3cc78f3c2fb47cc88fa599962ad333f.png)
После успешного ввода PIN-кода, будет получен весь список сертификатов, как из хранилища GnuGPG, так и хранящихся на подключенных токенах/смарт-картах PKCS#11:
![image](https://habrastorage.org/files/416/87d/edb/41687dedbca644698a731cddf13a4e03.png)
Более того, теперь использовать российскую криптографию в S/MIME для подписания и шифрования переписки могут использовать и другие почтовые клиенты (например, Claws, Evolution), которые используют для этого мехамизмы GnuPg/SMIME:
![image](https://habrastorage.org/files/e2d/189/3ab/e2d1893ab17f4cfc9cc5599f24a4f108.png)
![image](https://habrastorage.org/files/363/9e4/741/3639e4741dd541b99db3d6a07ac98f5f.png)
![image](https://habrastorage.org/files/f28/7ef/84c/f287ef84cd2f4bd2b6fbea19aa95b196.png)
Что дальше?
![image](https://habrastorage.org/files/d40/35f/6df/d4035f6df5f445d7bdc758fca6283da5.png)
![image](https://habrastorage.org/files/eeb/442/3c5/eeb4423c5c0c463e89d783884c9dc748.png)
Которые затем можно будет передавать в Удостоверяющие Центры и в итоге получать сертификаты.
Но это будет другой сказ.