2015-01-05 4 views
0

Я работаю над приложением, где я должен проверить, что 2 файла подписаны с тем же сертификатом (с нашим сертификатом). Если нет, то прервите программу.Каков наилучший способ проверки подлинности/сертификата?

я нашел в this вопрос, что я должен делать:

  1. Validate цепь сертификатов полностью обеспечить целостность и подлинность сертификата
  2. имя чекодателя
  3. Проверить имя субъекта
  4. Check ключевое поле использования.

Итак, для шага 1 я использую WinVerifyTrust, затем я прочитал свойства и сравнил их друг с другом.
Пока все хорошо, но что, если кто-то создает сертификат и подписывает эти два файла с ними? Тогда он все равно будет работать. Я знаю, что если этот сертификат не будет добавлен как доверенный издатель, то WinVerifyTrust не удастся. Но, допустим, он добавлен как доверенный издатель. Тогда это работает. Очевидно, что я не могу написать такие значения, как «мое название компании» в коде, и проверить, имеет ли свойство это значение.

Так как я могу проверить, действительно ли это мой сертификат? Если это действительно сертификат, который является «доверенным», он не только доверял мне или кому-то еще?

Заранее благодарен!

+0

Возможный дубликат [WinVerifyTrust для проверки конкретной подписи?] (Http://stackoverflow.com/questions/1072540/winverifytrust-to-check-for-a-specific-signature) –

+0

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

+0

@DavidGrayson: Звучит неплохо, но как я могу проверить хэш? – kampi

ответ

0

Если у вас есть доступ к эмитенту сертификатов (только открытый ключ), и вы доверия, что открытый ключ (вы приобрели его другими способами --- он не приходит с сертификатом вы проверяющими , вы уже сохранили его локально или т. д. - это единственная причина, по которой есть цепочка сертификатов), вы должны только проверить, что подпись действительна, чтобы гарантировать, что сертификат пользователя действителен. Цепочки сертификатов предназначены только для обеспечения того, чтобы у вас был один путь для обеспечения достоверности сертификата до корневого сертификата, которому вы доверяете (обычно это корневые сертификаты, поставляемые с дистрибутивами программного обеспечения).

требуется только проверка объекта (или других полей сертификата) в случае, если у вас разные профили или типы учетных записей в зависимости от информации, хранящейся в сертификате. Какое использование вы используете в тематическом формате или в полях, соответствующих сертификату, зависит от приложения. Обычно люди внедряют информацию об учетной записи пользователя в сертификат, чтобы вы могли использовать сертификаты для распространения информации об учетной записи.

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

Как вы можете проверить, действительно ли сертификат действительно ваш? Конечно, он должен быть подписан эмитентом сертификата (это может быть вы или эмитент, которому вы доверяете), и убедитесь, что эмитент это и никакой другой сертификат. В случае корпоративного приложения вы должны проверить, что один из подписчиков - это центр сертификации (обычно для каждого приложения или модуля приложения генерируются один или разные эмитенты сертификатов, каждый из которых подписывает сертификаты пользователя, принадлежащие этому модулю), если вы найдете этот эмитент в цепочке сертификатов, то вы можете доверять сертификату для предполагаемого использования.

+0

Спасибо за отличный ответ! Последняя часть - это то, что я хочу сделать, я просто не знаю, как это сделать. Я знаю, что мне нужно вызвать 'CertGetCertificateChain', но после этого я застрял. Может быть, у вас есть пример кода, как я могу делать то, что хочу? – kampi

+0

, так что если вы считаете его действительным ответом, отметьте его так. Комментарии приветствуются также :) –

+0

Я бы, я просто ждал, если у вас есть код :) Моя проблема на самом деле кодирует его. Я знаю логику, что я должен делать, я просто не знаю, как ее кодировать. – kampi

Смежные вопросы