Форум КриптоПро
»
Общие вопросы
»
Общие вопросы
»
Кто ни будь, знает как решить такую вот проблему
Статус: Новичок
Группы: Участники
Зарегистрирован: 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.
Что мы делаем не так ?
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.02.2008(UTC) Сообщений: 1,491 Откуда: Крипто-Про
Поблагодарили: 40 раз в 37 постах
|
Если нужен список сертификатов, то первый способ лучше.
А перед первым вызовом CertEnumCertificatesInStore(hStoreHandle, pCertContext) pCertContext чему равен?
Можно полный код? |
Татьяна ООО Крипто-Про |
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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 сертификаты показывает. Как он это делает интересно?
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 14.09.2011(UTC) Сообщений: 5 Откуда: Москва
|
Кстати, пример CryptMsgSign также не находит никаких сертификатов. Из чего я заключаю, что дело, скорее всего, в какой-то конфигурации.
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.02.2008(UTC) Сообщений: 1,491 Откуда: Крипто-Про
Поблагодарили: 40 раз в 37 постах
|
Пришлите мне на почту пример, который можно собрать и проверить. Возможно, передаёте неправильное имя хранилища, в этом случае CertOpenSystemStore создаёт новое хранилище. Это новое хранилище пусто, поэтому CertEnumCertificatesInStore всегда возвращает null.
|
Татьяна ООО Крипто-Про |
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 14.09.2011(UTC) Сообщений: 5 Откуда: Москва
|
Послал. Кстати, у меня сложилось такое же впечатление, я хотел проенумеровать все хранилища, но, похоже, соответствующие функции на линуксе просто отсутствуют
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 21.02.2014(UTC) Сообщений: 4 
|
Такая же проблема случилась. Есть все таки какое-то решение?
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 24.11.2009(UTC) Сообщений: 965 Откуда: Crypto-Pro
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 174 раз в 152 постах
|
В начальном посте описаны две проблемы, какая возникла у вас? Лучше всего сразу привести кусочек кода который не работает. |
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 21.02.2014(UTC) Сообщений: 4 
|
Один в один как у автора треда. Сертификат в хранилище есть, с закрытым ключем связан
./certmgr -list -store My
Certmgr 1.0 (c) "CryptoPro", 2007-2010. program for managing certificates, CRLs and stores
============================================================================= 1------- Issuer : OGRN=1111111111111, INN=111111111111, STREET=Улица, E=et@a.ru, C=RU, S=78 г. Санкт-Петербург, L=Санкт-Петербург, O=ООО , OU=Удостоверяющий центр, CN=СНГ Subject : SNILS=33333333333, OGRN=2222222222222, 1.2.643.3.141.1.2="#130435353535", 1.2.643.3.141.1.1="#130A34343434343434343434", INN=007811111111, C=RU, S=78 г. Санкт-Петербург, L=Санкт-Петербург, O=Организация тест, OU=Отдел тест, CN=Петров Петр Петрович, STREET=Адрес тест, T=Должность тест, G=Петр Петрович, SN=Петров Serial : 0x44504E07000000001C26 SHA1 Hash : 0x77365c5e07bdc957fd20a1ac4059b96f57e06761 Not valid before : 17/10/2013 13:04:00 UTC Not valid after : 17/10/2014 13:14:00 UTC PrivateKey Link : Yes. Container : HDIMAGE\\petrovr2.000\A5D2 =============================================================================
[ErrorCode: 0x00000000]
Store := CertOpenSystemStore(0, 'My'); if Store <> nil then writeln('The uMY store is open') else WriteError('Error getting store handle');
Cert := nil; Cert := CertEnumCertificatesInStore(Store, nil); тут Cert = nil, в GetLastError 0x80092004 Cannot find object or property
Если сделать энумерацию контейнеров - то контейнер есть, но ключей в нем нет.
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 24.11.2009(UTC) Сообщений: 965 Откуда: Crypto-Pro
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 174 раз в 152 постах
|
1) По поводу перечисления контейнеров. В первом посте логически неверный код. После того как вы получили имя контейнера в перечислении, вам нужно перевызвать CryptAcquireContext с этим именем и без флага CRYPT_VERIFYCONTEXT. После этого полученный хендл провайдера использовать в функции GetUserKey. 2) Код примера и команда certmgr выполняется от одного и того же пользователя? Отредактировано пользователем 21 февраля 2014 г. 19:59:49(UTC)
| Причина: Не указана |
|
|
|
|
|
|
Форум КриптоПро
»
Общие вопросы
»
Общие вопросы
»
Кто ни будь, знает как решить такую вот проблему
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close