Здравствуйте!
Понимаю, что для большинства это покажется глупым вопросом, но я уткнулся в тупик, даже не знаю что и где читать.
Появилась задача написать so-библиотеку для последующего встраивания в другой продукт.
Библиотека должна уметь 2 вещи, для начала:
1) Имитировать команду certmgr -list (перечислить список доступных сертификатов)
2) Подписывать
Для начала я открыл это:
http://cpdn.cryptopro.ru...sp_trunk/html/Titul.htmlв одной из веток было сказано, что надо использовать libcapilite20, который находится в пакете devel
Скачал последнюю доступную версию CSP 5
https://www.cryptopro.ru...2266/linux-amd64_deb.tgzПоставил все пакеты )
Подключил flash-накопитель и открыл интерфейс cp-tools
Подтянулся контейнер, импортировал сертификат в "Личные"
Выполнил последовательно 2 команды:
1) csptestf -absorb -certs -autoprov
2) csptest -keyset -enum_cont -fqcn -verifyc
Судя по их выводу сертификат успешно подтянулся, и затем, после выполнения команды certmgr -list я получал детальную информацию об имеющемся сертификату.
Далее я начал смотреть примеры из папки samples в opt/cprocsp/src/../..
А также просматривать документацию по первой ссылке, а точнее уже другой раздел -
http://cpdn.cryptopro.ru...te_trunk/html/Titul.htmlи документацию Microsoft Docs по CryptoAPI
Понял, что для первой задачи необходимо:
1) CertEnumSystemStore - и передать туда
а) CERT_SYSTEM_STORE_CURRENT_USER так как я правильно понимаю, что "Личные" доступны для текущего пользователя ? (было бы странно, если нет)
б) NULL - так написано в Microsoft Docs
в) ссылку на функцию, которая будет выводить данные
2) вызвать функцию CertOpenSystemStoreA и передать туда 0, потому что первый параметр по документации по сути выпилен и наименование хранилища, полученного первой функцией
3) В результате второго пункта мы получаем контекст первого сертификата и в цикле можем пройтись по всем сертификатам хранилища методом CertEnumCertificatesInStore
По примерам написал на C небольшой файл - по сути почти пример из Microsoft Docs
Собрал его командой: gcc -g -Wall -o p1 p1.c -DUNIX -DHAVE_LIMITS_H -DHAVE_STDIN_H -I/opt/cprocsp/include -I/opt/cprocsp/include/cpcsp -I/opt/cprocsp/include/capilite -DSIZEOF_VOID_P=8 -L/opt/cprocsp/lib/amd64 -lrdrsup -lcapi20 -lpthread -lcapi10
Предварительно добавив символьные ссылки на пути к библиотекам в систему
Запустил полученный файл и получил список хранилищ, в том числе хранилище "My", которое ведь и есть "Личные" ?
Но, по какой-то причине не было выведено ни одного сертификата
код вывода сертификатов проще некуда:
HCERTSTORE hSystemStore = NULL;
PCCERT_CONTEXT pCertContext = NULL;
if ((hSystemStore = CertOpenSystemStoreA(0, pwszSystemStore)))
{
printf("The %S system store opened.\n", pwszSystemStore);
while ((pCertContext = CertEnumCertificatesInStore(
hSystemStore,
pCertContext)))
{
if (CertGetNameString(
pCertContext,
CERT_NAME_SIMPLE_DISPLAY_TYPE,
0,
NULL,
pszNameString,
128))
{
printf("\nCertificate for %s \n", pszNameString);
}
else
fprintf(stderr, "CertGetName failed. \n");
}
}
else
{
printf("The %S system store did not open.\n", pwszSystemStore);
exit(1);
}
if (!CertCloseStore(hSystemStore, 0))
{
printf("Unable to close the %S system store.\n", pwszSystemStore);
exit(1);
}
else
{
printf("The %S system store closed.\n", pwszSystemStore);
}
И теперь вопрос. Что я делаю не так? Что я не сделал ? Куда мне вообще смотреть ))