Я не уверен, есть ли у нас вся необходимая информация, поэтому у меня нет однозначных ответов. Тем не менее, давайте посмотрим, сможем ли мы добиться прогресса в направлении решения.
Вы спросили:
Как узнать, какой сертификат загрузить и откуда?
Вы, как проверяющий, должны иметь этот доверенный сертификат в какой-либо форме. В Windows было бы хорошо, если бы этот сертификат был установлен в вашем хранилище сертификатов. Это то, что я предположил в своем ответе. Если вы не знаете, где находится сертификат, вам придется сначала выяснить это, в противном случае вы не сможете должным образом проверить подпись. Таким образом, подписчик должен предоставить сертификат верификатору (вам), через доверенный канал.
Вы также написали:
OpenSSL имеет красивую команду openssl smime -verify -inform der -in
LOCALSIG.DSA -content LOCALSIG.SF -noverify
, которая делает именно то, что я
хочу сделать.
Вы уверены, что это именно то, что вы хотите сделать? Поскольку вы передаете флаг -noverify
, все, что делает эта команда, проверяет, что LOCALSIG.DSA
содержит правильную подпись содержимого LOCALSIG.SF
. Однако он не подтверждает, что эта подпись была создана удостоверением, которому вы доверяете. Любой человек с действительным сертификатом и парой ключей мог создать эту подпись.
Чтобы проверить подпись, в том числе личность подписавшего, в версии stock-openssl, вам нужна вся цепочка сертификатов, доступная вам в формате, понятном openssl (PEM или DER), вплоть до самого себя. подписанный корневой сертификат. Затем вы можете проверить это с помощью немного другой команды
openssl smime -verify -inform der -in LOCALSIG.DSA -content LOCALSIG.SF -CAfile trusted-cert.pem
Ваш вопрос обновлен, чтобы указать, что сертификат подписи самоподписан и находится в хранилище сертификатов. Есть еще несколько возможных маршрутов, но я предполагаю, что на данный момент вы знаете, каково имя субъекта подписавшего, который, как вы ожидаете, сгенерировал эту подпись. (Если нет, то укажите, что вы делаете ожидаете.) С этой информацией вы можете использовать следующие шаги для проверки вашей подписи:
Первое использование CertEnumCertificatesInStore()
для поиска сертификата в хранилище сертификатов. Пример использования см. Пример программы C: перечисление сертификатов в хранилище .
Если у вас есть дескриптор этого сертификата, используйте CryptImportPublicKeyInfoEx2()
, чтобы получить дескриптор требуемого открытого ключа.
Дескриптор типа BCRYPT_KEY_HANDLE
, который вы можете использовать с BCryptVerifySignature()
для проверки.