| ||||
| ||||
Добрый день. Как можно получить контекст личного сертификата (чтобы вызвать потом в CryptSignMessage()), используя только дискету с ключем и сертификатом (в 1.1)? Вроде бы все необходимое на дискете есть (если WriteCertToCSP=TRUE) Идея в том, чтобы не заставлять клиента устанавливать свой сертификат в MY. Спасибо | ||||
Ответы: | ||||
| ||||
Вот пример из файла 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; } | ||||
| ||||
Спасибо, все получилось. И даже провайдер удалось кешировать (т.е. вызов нескольких 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? Спасибо. | ||||
| ||||
В версии 1.1 побороться с этой проблемой не получиться. В версии 1.2 такая возможность есть. | ||||