| ||||
| ||||
Есть сертификат1, установленный на компьютере. Надо подписать запрос на сертификат2 закрытым ключом ЭЦП, соответствующим сертификату1. То есть на входе моей процедуры - PCCERT_CONTEXT, соответствующий сертификату1. Как осуществляется привязка контейнера к сертификату? Подскажите, пожалуйста. Лучше не примерами, а "принципом действия" | ||||
Ответы: | ||||
| ||||
Используйте функцию: BOOL WINAPI CryptSignAndEncodeCertificate( HCRYPTPROV hCryptProv, DWORD dwKeySpec, DWORD dwCertEncodingType, LPCSTR lpszStructType, const void* pvStructInfo, PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm, const void* pvHashAuxInfo, PBYTE pbEncoded, DWORD* pcbEncoded ); где hCryptProv получается вызовом функции CryptAcquireContext(...) с указанием имени контейнера вашего секретного ключа, const void* pvStructInfo = (void*)(PCCERT_CONTEXT->pCertInfo) | ||||
| ||||
В PCertInfo его в чистом виде не отыскал. Скорее всего, он "выдирается" из pCertInfo -> rgExtension только вот как? | ||||
| ||||
В смысле, а как имя контейнера получить? | ||||
| ||||
ой, чего-то я не то Вам написал, надо вот так: CryptSignAndEncodeCertificate(HCRYPTPROV hCryptProv,DWORD dwKeySpec,DWORD dwCertEncodingType,LPCSTR pszStructType, const void* pvStructInfo,RYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm, const void* pvHashAuxInfo, PBYTE pbEncoded, DWORD* pcbEncoded ); const void* pvStructInfo = (void*)PCERT_REQUEST_INFO где hCryptProv получается вызовом функции (Если сертификат связан с секрентым ключём, а если нет то его надо связать через панель CSP) BOOL WINAPI CryptAcquireCertificatePrivateKey( PCCERT_CONTEXT pCert, DWORD dwFlags, void* pvReserved, HCRYPTPROV* phCryptProv, DWORD* pdwKeySpec, BOOL* pfCallerFreeProv ); | ||||
| ||||
Спасибо, добрый человек. Запрос подписать получилось. Ответа CryptAcquireCertificatePrivateKey было бы достаточно - чего-то я проглядел эту функцию, когда MSDN читал :-) | ||||