Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline talisv  
#1 Оставлено : 14 сентября 2011 г. 16:25:31(UTC)
talisv

Статус: Новичок

Группы: Участники
Зарегистрирован: 14.09.2011(UTC)
Сообщений: 5
Откуда: Москва

Проблема получения списка сертификатов на боевом сервере:
Мы опробовали 2 способа получения сертификатов.

1)

if ((hStoreHandle = CertOpenSystemStore(
0,
pszStoreName)) == NULL) //pszStoreName = "My"
{
return 0;
}

//-------------------------------------------------------------------
// Find the certificates in the system store.

while(pCertContext= CertEnumCertificatesInStore(
hStoreHandle,
pCertContext)) // on the first call to the function,
// this parameter is NULL
// on all subsequent calls,
// this parameter is the last pointer
// returned by the function
{
.....
}

pCertContext при первом же вызове получается 0 - как будто сертификатов нет.
Так же мы попробовали функцию CertFindCertificateInStore.
Она тоже ничего не находила.


2) Попробовали получить список контейнеров и ключей в них, чтобы по ключам
получить сертификат:

void enumkeys()
{
HCRYPTPROV hCryptProv = 0; // дескриптор CSP
BYTE pContainerName[1024];
DWORD containerNameSize = 1024;

if(!CryptAcquireContext(
&hCryptProv, // Адрес возврашаемого дескриптора.
0, // Используется имя текущего зарегестрированного
пользователя.
NULL, // Используется провайдер по умолчанию.
PROV_GOST_2001_DH, // Необходимо для зашифрования и
подписи.
CRYPT_VERIFYCONTEXT)) // Никакие флаги не нужны.
{
printf("Cryptographic context could not be acquired.");
return;
}
printf("CSP has been acquired. \n");

BOOL res = CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS,
pContainerName,&containerNameSize, CRYPT_FIRST);
while(res)
{
HCRYPTKEY hKey = NULL;
CryptGetUserKey(hCryptProv, AT_SIGNATURE,&hKey);
if(hKey==NULL)
CryptGetUserKey(hCryptProv, AT_KEYEXCHANGE,&hKey);
res = CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS,
pContainerName,&containerNameSize, CRYPT_NEXT);
}
}

Контейнеры находятся успешно, но ключей в них нет. hKey всегда 0.

Пробовали и на 32-битном и на 64-битном Linux, включая рабочий сервер, где
уже стоит наш сертификат.
Компилировали похожие примеры из sdk, но они не работают точно так же. Хотя
готовые утилиты типа certmgr работают.

Линковали с библиотекой capi20.

Что мы делаем не так ?
Offline Татьяна  
#2 Оставлено : 15 сентября 2011 г. 23:11:24(UTC)
Татьяна

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.02.2008(UTC)
Сообщений: 1,491
Откуда: Крипто-Про

Поблагодарили: 40 раз в 37 постах
Если нужен список сертификатов, то первый способ лучше.

А перед первым вызовом
CertEnumCertificatesInStore(hStoreHandle, pCertContext)
pCertContext чему равен?

Можно полный код?
Татьяна
ООО Крипто-Про
Offline talisv  
#3 Оставлено : 16 сентября 2011 г. 17:48:51(UTC)
talisv

Статус: Новичок

Группы: Участники
Зарегистрирован: 14.09.2011(UTC)
Сообщений: 5
Откуда: Москва

Вот код:

wchar_t *enum_certificates_in_store(LPTSTR pszStoreName, wchar_t *message)
{
//--------------------------------------------------------------------
// Declare and initialize variables.
HANDLE hStoreHandle = NULL;
PCCERT_CONTEXT pCertContext = NULL;
int res = 0;
wchar_t *result = 0;
DWORD LE = 0UL;
wchar_t LEMess [_MAX_PATH];

enumkeys();
return 0;
//--------------------------------------------------------------------
// Open a system certificate store.

if ((hStoreHandle = CertOpenSystemStore(
0,
pszStoreName)) == NULL)
{
LE = GetLastError ();
wprintf ( LEMess, L"������ ��� �������� ��������� ������������, ��� = 0x%08X\n", LE );
wset_message( LEMess );
return 0;
}

//-------------------------------------------------------------------
// Find the certificates in the system store.

LPTSTR pSerial = NULL;
LPTSTR pSubjectKeyId = NULL;
LPTSTR pAuthorityKeyId = NULL;
LPTSTR pThumbprint = NULL;
LPTSTR pUserName = NULL;

while(pCertContext= CertEnumCertificatesInStore(
hStoreHandle,
pCertContext)) // on the first call to the function,
// this parameter is NULL
// on all subsequent calls,
// this parameter is the last pointer
// returned by the function
{
....

На винде это работает отменно, а под линуксом нет. При этом certmgr сертификаты показывает. Как он это делает интересно?
Offline talisv  
#4 Оставлено : 16 сентября 2011 г. 17:53:13(UTC)
talisv

Статус: Новичок

Группы: Участники
Зарегистрирован: 14.09.2011(UTC)
Сообщений: 5
Откуда: Москва

Кстати, пример CryptMsgSign также не находит никаких сертификатов. Из чего я заключаю, что дело, скорее всего, в какой-то конфигурации.
Offline Татьяна  
#5 Оставлено : 16 сентября 2011 г. 18:12:42(UTC)
Татьяна

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.02.2008(UTC)
Сообщений: 1,491
Откуда: Крипто-Про

Поблагодарили: 40 раз в 37 постах
Пришлите мне на почту пример, который можно собрать и проверить.
Возможно, передаёте неправильное имя хранилища, в этом случае CertOpenSystemStore создаёт новое хранилище. Это новое хранилище пусто, поэтому CertEnumCertificatesInStore всегда возвращает null.
Татьяна
ООО Крипто-Про
Offline talisv  
#6 Оставлено : 16 сентября 2011 г. 18:30:12(UTC)
talisv

Статус: Новичок

Группы: Участники
Зарегистрирован: 14.09.2011(UTC)
Сообщений: 5
Откуда: Москва

Послал. Кстати, у меня сложилось такое же впечатление, я хотел проенумеровать все хранилища, но, похоже, соответствующие функции на линуксе просто отсутствуют
Offline prosoft  
#7 Оставлено : 21 февраля 2014 г. 11:52:03(UTC)
prosoft

Статус: Новичок

Группы: Участники
Зарегистрирован: 21.02.2014(UTC)
Сообщений: 4
Российская Федерация

Такая же проблема случилась. Есть все таки какое-то решение?
Offline cross  
#8 Оставлено : 21 февраля 2014 г. 13:37:10(UTC)
Анатолий Беляев

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 24.11.2009(UTC)
Сообщений: 965
Откуда: Crypto-Pro

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
В начальном посте описаны две проблемы, какая возникла у вас? Лучше всего сразу привести кусочек кода который не работает.
Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
Offline prosoft  
#9 Оставлено : 21 февраля 2014 г. 14:00:24(UTC)
prosoft

Статус: Новичок

Группы: Участники
Зарегистрирован: 21.02.2014(UTC)
Сообщений: 4
Российская Федерация

Один в один как у автора треда. Сертификат в хранилище есть, с закрытым ключем связан




Если сделать энумерацию контейнеров - то контейнер есть, но ключей в нем нет.
Offline cross  
#10 Оставлено : 21 февраля 2014 г. 19:59:18(UTC)
Анатолий Беляев

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 24.11.2009(UTC)
Сообщений: 965
Откуда: Crypto-Pro

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
1) По поводу перечисления контейнеров. В первом посте логически неверный код. После того как вы получили имя контейнера в перечислении, вам нужно перевызвать CryptAcquireContext с этим именем и без флага CRYPT_VERIFYCONTEXT. После этого полученный хендл провайдера использовать в функции GetUserKey.
2) Код примера и команда certmgr выполняется от одного и того же пользователя?

Отредактировано пользователем 21 февраля 2014 г. 19:59:49(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.