07.11.2005 15:23:55Помогите с проблемой увязки сертификата и ключевой пары Ответов: 5
Альт
Увязываю программно...
CryptKeyProvInfo.pwszContainerName := PWideChar( wsContainerName );
CryptKeyProvInfo.pwszProvName := PWideChar( wsProviderName );
CryptKeyProvInfo.dwProvType := m_pContainer.ProviderType;
CryptKeyProvInfo.dwKeySpec := AT_KEYEXCHANGE;
CryptKeyProvInfo.dwFlags := CERT_SET_KEY_CONTEXT_PROP_ID;
CryptKeyProvInfo.cProvParam := 0;
CryptKeyProvInfo.rgProvParam := nil;


CertSetCertificateContextProperty( pCertificateContext, CERT_KEY_PROV_INFO_PROP_ID, 0, @CryptKeyProvInfo );

Если теперь подпихиваю его в виндовое хранилище... то могу с ним нормально работать... но есть требование _хранить связанные сертификаты в базе данных_ потому после выполнения CertSetCertificateContextProperty и экспортирую его SignAndEncodeCertificate... сертификат становится битым ;( для проверки, например, при попытке установить его в хранилище получаю "The integrity of this certificate cannot be guaranted. The certificate may be corrupted or may have been altered." ну все правильно говорит, но мне то нужно увязать ключики и сертификат и сохранить результат. Какие есть варианты?
помогите
 
Ответы:
08.11.2005 11:06:16Kirill Sobolev
А как именно Вы экспортируете сертификат (CryptSignAndEncodeCertificate)?
09.11.2005 7:06:09Альт
Ой… здравствуйте Кирил… следил следил за темой… и все равно успел пропустить ваш ответ… экспортирую вот так:

CryptSignAndEncodeCertificate( pProv, AT_KEYEXCHANGE, X509_ASN_ENCODING + PKCS_7_ASN_ENCODING, X509_CERT_TO_BE_SIGNED, @CertInfo, @SigAlg, nil, nil, @dwCertificateLength );

Где:
pProv – Ваш открытый провайдер.
CertInfo – Структура CERT_INFO, полученная из PCCERT_CONTEXT функцией CertCreateCertificateContext

SigAlg.pszObjId := pchSigAlg; // нахожу его через CryptEnumOIDInfo( CRYPT_SIGN_ALG_OID_GROUP_ID,… танцуя от алгоритма публичного ключа szOID_CP_GOST_R3410EL = ’1.2.643.2.2.19’, и равен szOID_CP_GOST_R3411_R3410EL = ’1.2.643.2.2.3’
SigAlg.Parameters.cbData := 0;
SigAlg.Parameters.pbData := nil;

Ну и получив длину вызываю еще раз… ключи пары AT_KEYEXCHANGE в контейнере создаю с флагами (CRYPT_EXPORTABLE, CRYPT_ARCHIVABLE) если это важно

Полученный сертификат по длине совпадает с тем, что был до увязки.
Из-за чего я все это затеял… при установке сертификатов в базу ложится часть информаций из сертификата… но установив его в виндовое хранилище я могу получить коллизию, если хитрый пользователь удалит свой сертификат через сертификатный снапин в mmc или опции ie.
Может есть другие варианты?
09.11.2005 10:18:14maxdm
Честно говоря, мне не известно документированного способа экспортировать ссылку на открытый ключ (если правильно понял суть вопроса). Хотя можно попытаться выкорчевать файлики из профайла пользователя. Вот только, получится ли их потом положить обратно... Но ссылка на ключ нигде в сертификате не указана - это свойство CERT_CONTEXT - может и хранить ее отдельно?
09.11.2005 10:20:53maxdm
Да, и функция CryptSignAndEncodeCertificate к эспорту сертификата отношения не имеет.
09.11.2005 17:04:57Альт
А через PFXExportCertStore ссылка на контейнер сохранится?
Или может вызов CertOpenStore CERT_STORE_PROV_FILE? Ему хендл от CreateFileMapping подсунуть можно?