Проверьте подпись Authenticode как принадлежащую нашей компании для автоматического обновления - PullRequest
10 голосов
/ 04 января 2011

Я внедряю функцию автоматического обновления, и мне нужны советы о том, как сделать это безопасно, используя лучшие практики. Я хотел бы использовать подпись Authenticode загруженного файла, чтобы убедиться, что он безопасен для запуска (т. Е. Исходит от нашей компании и не был подделан). Мой вопрос очень похож на вопрос № 2008519.

Суть вопроса: каков наилучший и наиболее безопасный способ проверки подписей Authenticode для функции автоматического обновления? Какие поля в сертификате нужно проверить? Требования следующие: (1) проверить, что подпись действительна, (2) проверить, что это моя подпись, (3) старые клиенты все еще могут обновить, когда истекает срок действия моего сертификата и я получаю новый.

Вот некоторая справочная информация / идеи из моего исследования: я считаю, что это можно разбить на два этапа:

  1. Убедитесь, что подпись действительна. Я полагаю, что это должно быть легко с использованием WinVerifyTrust, как описано в http://msdn.microsoft.com/en-us/library/aa382384(VS.85).aspx - я не ожидаю проблем здесь.

  2. Убедитесь, что подпись соответствует нашей компании, а не другой компании. Кажется, на этот вопрос сложнее ответить:

Одна из возможностей - проверить некоторые строки в подписи. Может быть получено с помощью кода в статье MS KB # 323809, но эта статья не дает рекомендаций о том, какие поля следует проверять для данного типа приложения (или любого другого, в этом отношении). Вопрос # 1072540 также иллюстрирует, как получить некоторую информацию о сертификате, но опять же не рекомендует, какие поля на самом деле проверять. Меня беспокоит то, что строки могут быть не самой лучшей проверкой: что, если, например, другой человек сможет получить сертификат с таким же именем? Или, если у нас есть веская причина изменить строки в будущем?

Человек на вопрос № 2008519 имеет очень похожее требование. Его потребность в функции TrustedByUs идентична моей. Однако он делает проверку, сравнивая открытые ключи. Хотя это будет работать в краткосрочной перспективе, похоже, что оно не будет работать для функции автоматического обновления. Это связано с тем, что сертификаты подписи кода действительны только в течение 2-3 лет. Поэтому в будущем, когда мы купим новый сертификат через 2 года, старые клиенты не смогут больше обновляться из-за изменения открытого ключа.

1 Ответ

4 голосов
/ 04 января 2011

Человек на вопрос № 2008519 имеет очень похожее требование.Его потребность в функции TrustedByUs идентична моей.Однако он делает проверку, сравнивая открытые ключи.Хотя это будет работать в краткосрочной перспективе, похоже, что оно не будет работать для функции автоматического обновления.Это связано с тем, что сертификаты подписи кода действительны только в течение 2-3 лет.Поэтому в будущем, когда мы купим новый сертификат через 2 года, старые клиенты не смогут больше обновляться из-за изменения открытого ключа.

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

...