02.06.2005 15:34:50Пытаюсь подписать запрос другой подписью Ответов: 5
SeregaEvg
Есть сертификат1, установленный на компьютере. Надо подписать запрос на сертификат2 закрытым ключом ЭЦП, соответствующим сертификату1.

То есть на входе моей процедуры - PCCERT_CONTEXT, соответствующий сертификату1. Как осуществляется привязка контейнера к сертификату?

Подскажите, пожалуйста. Лучше не примерами, а "принципом действия"
 
Ответы:
02.06.2005 16:59:07Александр
Используйте функцию:
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)
02.06.2005 17:24:12SeregaEvg
В PCertInfo его в чистом виде не отыскал. Скорее всего, он "выдирается" из pCertInfo -> rgExtension только вот как?
02.06.2005 17:25:47SeregaEvg
В смысле, а как имя контейнера получить?
02.06.2005 17:44:08Александр
ой, чего-то я не то Вам написал, надо вот так:
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
);
03.06.2005 17:07:03SeregaEvg
Спасибо, добрый человек. Запрос подписать получилось.

Ответа CryptAcquireCertificatePrivateKey было бы достаточно - чего-то я проглядел эту функцию, когда MSDN читал :-)