26.04.2002 18:51:15Контекст личного сертификата Ответов: 3
ak
Добрый день.
Как можно получить контекст личного сертификата (чтобы вызвать потом в CryptSignMessage()), используя только дискету с ключем и сертификатом (в 1.1)? Вроде бы все необходимое на дискете есть (если WriteCertToCSP=TRUE) Идея в том, чтобы не заставлять клиента устанавливать свой сертификат в MY.
Спасибо
 
Ответы:
27.04.2002 15:37:19kure
Вот пример из файла property.c

/* Получить сертификат.*/
if (!CryptGetKeyParam (hUserKey, KP_CERTIFICATE, NULL,
&dwUserCertLength, 0)) {
HandleErrorFL ("Error during GetKeyParam.\n");
goto err;
}
pbUserCert = malloc (dwUserCertLength);
if (pbUserCert == NULL) {
HandleErrorFL ("Error during malloc.\n");
goto err;
}
if (!CryptGetKeyParam (hUserKey, KP_CERTIFICATE, pbUserCert,
&dwUserCertLength, 0)) {
HandleErrorFL ("Error during GetKeyParam.\n");
goto err;
}
/* Декодировать сертификат */
pUserCert = CertCreateCertificateContext (
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, pbUserCert,
dwUserCertLength);
if (pUserCert == NULL) {
HandleErrorFL ("Error during CertCreateCertificateContext.\n");
goto err;
}
27.04.2002 20:13:22ak
Спасибо, все получилось. И даже провайдер удалось кешировать (т.е. вызов нескольких CryptSignMessage() не требует ввода пароля.
НО. Все-равно пароль приходится вводить дважды - при вызове CryptAcquireContext() и при первом CryptSignMessage().

Я делаю так:
CryptAcquireContext() // получил контекст
CryptGetUserKey (hProv, AT_KEYEXCHANGE, &hUserKey) // получил ключ
CryptGetKeyParam (hUserKey, KP_CERTIFICATE, NULL, &dwUserCertLength, 0) // получил серт.
CertCreateCertificateContext(MY_ENCODING, pbUserCert, dwUserCertLength) // получил контекст серт.
создал и заполнил CRYPT_KEY_PROV_INFO, в т.ч. установил dwFlags = CERT_SET_KEY_CONTEXT_PROP_ID

CertSetCertificateContextProperty(pUserCert, CERT_KEY_PROV_INFO_PROP_ID, CERT_STORE_NO_CRYPT_RELEASE_FLAG, &stProvInfo)// установил свойства контекста серт.

Можно ли выполнить CryptAcquireContext() так, чтобы не вводить пароль? Или надо как-то более хитро выполнять CertSetCertificateContextProperty?

Спасибо.
06.05.2002 13:46:17Александр
В версии 1.1 побороться с этой проблемой не получиться. В версии 1.2 такая возможность есть.