Как проверить, что подписанная DLL была подписана мной?

Я создал самогенерируемый сертификат для подписи DLL. Когда я загружаю эту DLL в свое приложение C ++, я могу проверить, действителен ли сертификат подписи кода, с помощью WinVerifyTrust api.

Но я не могу найти способ определить, что DLL была подписана одним из моих сертификатов. Даже используя CryptQueryObject api, я не нахожу никакой полезной информации.

Есть у кого-нибудь идеи, как это сделать? Или это событие возможно?

Спасибо


person Arkonis    schedule 28.01.2009    source источник


Ответы (3)


CryptVerifyCertificateSignature - это не то, что вам нужно?

person Bill Zeller    schedule 28.01.2009

Если вы подписываете сертификат, используя свой закрытый ключ, его можно проверить только с помощью вашего открытого ключа. Так работает криптография с открытым ключом. Если вы можете использовать открытый ключ для проверки подписи, значит, вы знаете, что соответствующий закрытый ключ должен использоваться для ее подписания.

person Graeme Perrow    schedule 29.01.2009

Если вам нужна версия, которая также работает с более ранними версиями Windows, чем та, которую показал вам Билл Зеллер, вы можете использовать следующее:

  1. Используйте CryptQueryObject с CERT_QUERY_OBJECT_FILE
  2. Используйте CryptMsgGetParam с CMSG_SIGNER_CERT_INFO_PARAM на HCRYPTMSG, полученном в предыдущем вызове
  3. Теперь используйте CertCompareIntegerBlob для сравнения вашего известного серийного номера (сертификата) (или номеров, в цикле) с номером в файле.

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

Примечание: при просмотре серийного номера сертификата в диалоговом окне свойств файла показанные там байты отображаются в обратном порядке по сравнению с содержимым PCERT_INFO (CERT_INFO::SerialNumber), которое вы получаете из CryptMsgGetParam. Поэтому перед сравнением убедитесь, что вы храните свои серийные номера в обратном или обратном порядке.

Также обратите внимание: вам все равно потребуется установить сертификат как доверенный, чтобы WinVerifyTrust (не упомянутый выше) вообще считал подпись кода надежной. Я только что описал часть о том, как узнать, что использовался ваш собственный сертификат.

person 0xC0000022L    schedule 20.08.2012