Как проверить, что моя организация подписала доверенный двоичный файл Windows?

Это дополнительный вопрос квопрос 1072540, 'WinVerifyTrust для проверки конкретной подписи? '.

Я хочу написать функцию C ++ Позволяет вызвать ееTrustedByUs формы:

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

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

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

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

KB323809 показывает, как извлечь строки из сертификата, встроенного в наш двоичный файл. В этом примере показано, как извлечь строки из сертификата подписи в егоGetProgAndPublisherInfo функция, но яМне неудобно использовать совпадение строк для проверки сертификата.

Что я хотел бы сделать, это извлечь открытый ключ из встроенной подписи и сравнить его с открытым ключом, который в первую очередь соответствует закрытому ключу, который подписал мой двоичный файл.

Документация дляCryptMsgGetParam говорит, чтоCMSG_SIGNER_CERT_ID_PARAM параметр 'Возвращает информацию о подписавшем сообщении, необходимую для идентификации подписавшегос открытым ключом, Мне удалось получить сертификатСерийный номер с этим ключом. Мой код выглядит так:

// Get message handle and store handle from the signed file.
fResult = CryptQueryObject(CERT_QUERY_OBJECT_FILE,
    L"C:\\Program Files\\MySignedProgram.exe",
    CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED,
    CERT_QUERY_FORMAT_FLAG_BINARY,
    0, &dwEncoding, &dwContentType, &dwFormatType, &hStore, &hMsg, NULL);

// Get the public key information about the signer
// First get the size
DWORD dwCertIdSize(0);
fResult = CryptMsgGetParam(hMsg, CMSG_SIGNER_CERT_ID_PARAM,
    0, NULL, &dwCertIdSize);
BYTE* pCertId = new BYTE(dwCertIdSize);
::ZeroMemory(pCertId,dwCertIdSize);

// Now get the cert info
fResult = CryptMsgGetParam(hMsg, CMSG_SIGNER_CERT_ID_PARAM,
    0, (PVOID)pCertId, &dwCertIdSize);

if(fResult)
{      
    CERT_ID* pId = (CERT_ID*)pCertId;  
    pId->HashId;
    pId->dwIdChoice;
    pId->IssuerSerialNumber;  // Valid serial number (reversed)
    pId->KeyId;   
    _tprintf("pid\n");
}

Это близко к тому, что я хочу, но на самом деле яЯ хотел бы использовать сертификат подписиоткрытый ключ, чтобы убедиться, что целевой двоичный файл со знаком был действительно создан с моей конкретной парой открытого / закрытого ключа.

С использованиемCMSG_ENCRYPTED_DIGEST пометить этот код успешно:

// Get digest which was encrypted with the private key
DWORD digestSize(0);
fResult = CryptMsgGetParam(hMsg, CMSG_ENCRYPTED_DIGEST, 0, NULL, &digestSize);

BYTE* pDigest = new BYTE[digestSize];

// Next CryptMsgGetParam call succeds,
// pDigest looks valid, can I use this to confirm my public key
// was used to sign MySignedProgram.exe ?
fResult = CryptMsgGetParam(hMsg, CMSG_ENCRYPTED_DIGEST, 0, pDigest, &digestSize);

Суть вопроса: Учитывая информацию о сертификате, обнаруженнуюCryptQueryObjectКакой метод я должен использовать, чтобы убедиться, что целевой файл был действительно подписан с использованием закрытого ключа, который соответствует общедоступному ключу, доступному мне при выполнении вышеуказанного кода?

Ответы на вопрос(1)

Ваш ответ на вопрос