Как проверить, что мой orgainization подпись доверенного Windows бинарную?

это следующий вопрос к вопрос 1072540, ' WinVerifyTrust для проверки конкретной подписи?'.

Я хочу написать функцию C++, давайте назовем ее TrustedByUs вида:

bool TrustedByUs(std::string pathToBinary, std::string pathToPublicKey)

идея заключается в том, что мы даем этой функции путь к бинарными .dll или .exe-файл, подписанный цифровой подписью. The pathToPublicKey string-это путь к открытому ключу нашего конкретного сертификата подписи.

использование кода в http://support.microsoft.com/kb/323809 это довольно прямо вперед, чтобы проверить, что pathToBinary файл на самом деле доверяет операционной системе.

теперь я на том же месте, что и автор вопроса 1072540, я знаю, что ОС доверяет подписавшему этот двоичный файл, но я хочу знать, является ли ключ RSA моей организации тем, который подписал двоичный файл.

KB323809 показывает, как извлечь строки из сертификата, встроенного в наш двоичный файл. Этот пример показывает, как извлечь строки из сертификата подписи в его

1 ответов


вы хотите CMSG_SIGNER_INFO_PARAM вместо.

вы можете использовать это, чтобы получить сертификат на сертификат в хранилище сертификатов, возвращенных CryptQueryObject:

CryptMsgGetParam(hMsg, 
                 CMSG_SIGNER_INFO_PARAM, 
                 0, 
                 NULL, 
                 &dwSignerInfo);
PCMSG_SIGNER_INFO pSignerInfo = (PCMSG_SIGNER_INFO) malloc(dwSignerInfo);
CryptMsgGetParam(hMsg, 
                 CMSG_SIGNER_INFO_PARAM, 
                 0, 
                 pSignerInfo, 
                 &dwSignerInfo);

PCCERT_CONTEXT pCertContext = CertFindCertificateInStore(hStore,
                                          ENCODING,
                                          0,
                                          CERT_FIND_SUBJECT_CERT,
                                          (PVOID)pSignerInfo,
                                          NULL);
// Compare with your certificate:
// - check pCertContext->pbCertEncoded (length is pCertContext->cbCertEncoded)

// *OR*
// Compare with your public-key:
// - check pCertContext->pCertInfo->SubjectPublicKeyInfo.Algorithm and
//   pCertContext->pCertInfo->SubjectPublicKeyInfo.PublicKey