28.05.2007 11:04:32Как правильно добавить сертификат в хранилище сертификатов? Ответов: 1
Дмитирй

Пожайлуста, помогите в решении следующей задачи:

1. Пользователю выдают закрытый и открытый ключ на дискете, там же находиться X.509 сертификат.
2. Администратор регистрирует пользователя на рабочей станции, предоставляя login, password. При этом личный сертификат пользователя не устанавливает. Также на рабочей станции установленно CriptoPro-2.0, и программа подписи и проверки документов.
3. Пользователь приходит в первый раз на рабочую станцию, и хочет подписать документ, при этом при вставленной дискете подпись должна производиться, а при вынутой нет.

На текущий момент есть реализация, которая не работает:
1. Получаю криптопровайдер, и создаю сертификат из файла
CRYPTOGRAPHY_ASSERT_TRUE
(
CryptAcquireContext
(
&provider
, NULL
, NULL
, providerType
, CRYPT_VERIFYCONTEXT
)
, "Can't allocate provider"
) ;

PCCERT_CONTEXT retVal = CertCreateCertificateContext
(
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING
, &buffer[0]
, (DWORD)buffer.size()
) ;

2. Получаю хранилище сертификатов, и добавляю в него сертификат
const DWORD openStoreFlags =
CERT_STORE_OPEN_EXISTING_FLAG |
CERT_SYSTEM_STORE_CURRENT_USER ;
HCERTSTORE store__ = CertOpenStore
(
CERT_STORE_PROV_SYSTEM
, 0
, 0
, openStoreFlags
, L"MY"
) ;

CRYPTOGRAPHY_ASSERT_TRUE
(
CertAddCertificateContextToStore
(
store__
, certificate.getPCCERT_CONTEXT()
, CERT_STORE_ADD_REPLACE_EXISTING
, 0
)
, "Can't add certificate to certificate store"
) ;
3. Извлекаю сертификат и пытаюсь подписать
PCCERT_CONTEXT certificate = CertFindCertificateInStore
(
store__
, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING
, 0
, CERT_FIND_SUBJECT_STR
, certificateName
, NULL
) ;


Неправильно выполняемые операции:

1. При добавлении сертификата в хранилище, функция отрабатывает успешно, но
самого сертификата в хранилище не видно. Просмотр хранилища выполняется при
помощи Свойства Обозревателя -> Содержание -> Сертификаты -> Личные

2. Разработка приложения ведется на машине, на которой был получен
сертификат от тестового центра КриптоПро. В процессе функционального
тестирования сертификат удаляется из хранилища:
CertDeleteCertificateFromStore
(
CertDuplicateCertificateContext
(
certificate->getPCCERT_CONTEXT()
)
)

Тесты на формирование подписи не выполняются.
Затем сертификат, по указанной ранее схеме добавляется в хранилище, и тесты на подпись документа выполняются. При этом сертификата в хранилище не видно.

3. При запуске приложения на виртуальной машине, и программной установке сертификата ошибок не происходит, но при попытке сформировать подпись формируется сообщение об ошибке:
2148081675 - Не удается найти сертификат и закрытый ключ для расшифровки
При этом сертификат в хранилище не отображается.

Как правильно добавить сертификат в хранилище сертификатов?
 
Ответы:
28.05.2007 11:40:26Kirill Sobolev
Один из самых популярных вопросов :)
http://www.cryptopro.ru/cryptopro/forum/view.asp?q=81