Может ли сборка .NET подписываться с использованием сертификата X509? - PullRequest
3 голосов
/ 25 августа 2011

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

Итак, в процессе я решил проверить сертификат после его установки в моей системе.Затем, используя следующий код, я попытался проверить процесс проверки подлинности при сертификации:

const string x509Cert = @"\PathToMyCertificate\LMC.cer";
var cert = new X509Certificate(x509Cert);
var pmc = new PublisherMembershipCondition(cert);
if(pmc.Check(Assembly.GetCallingAssembly().Evidence))
{
   Console.WriteLine("Assembly belongs to publisher");
}

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

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

var publisher = new Publisher(X509Certificate.CreateFromCertFile(x509Cert));
var evidence = Assembly.GetCallingAssembly().Evidence;
evidence.AddHost(publisher);

// Create an identity permission based on publisher evidence.
var x509Permission = (PublisherIdentityPermission)publisher.CreateIdentityPermission(evidence);
x509Permission.Demand();

Но это тоже не сработало.Затем я проверил свойства своего проекта, чтобы увидеть, есть ли способ подписать его там с помощью ключа X509Certificate, но ничего.Единственный вариант, который я вижу, - это подписать с помощью манифестов Click Once;но опция «Выбрать из файла» ищет расширение .pfx.Поэтому я думаю, что, возможно, этот метод работает только для поддержки сертификатов, сгенерированных Click-Once?

Per BOL: «Если у вас есть файл ключа или сертификат в другом формате, сохраните его в хранилище сертификатов Windows и выберите сертификатописано в предыдущей процедуре. "Я установил свой сертификат X509 в хранилище доверенных корневых центров сертификации.Разве это не хранилище сертификатов Windows?Потому что в окне хранилища сертификатов ничего не отображается.

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

Итак, можно ли подписать сборку .NET с помощью сертификата X509?Если да, какая документация доступна для помощи в выполнении этой задачи?

Ответы [ 2 ]

3 голосов
/ 25 августа 2011

Publisher * классы связаны с Authenticode (tm).

Найдите инструменты командной строки: * цифровой код (или signtool) * chktrust

о том, как вы можете подписать любые .exe, .dll (и .cab, .ocx), используя действующий сертификат подписи кода. Также может помочь поиск в Google по Authenticode или «сертификату подписи кода».

1 голос
/ 25 августа 2011

Вопрос в том, что вы хотите сделать.Существует подпись .NET (с использованием пары ключей RSA), используемая для строгого именования сборок, и существует Authenticode, который позволяет подписывать любой файл в формате PE, включая сборки в файлах DLL.Обратите внимание, что Authenticode не является специфичным для .NET и ничего не знает о .NET.Это подписывает структуру PE.

Как сказал poupou, для подписи Authenticode (используя сертификаты X.509, подходящие для подписи кода) вы можете использовать инструмент SignTool.exe..NET проверит подпись при загрузке сборки, но в некоторых случаях такая проверка может занять дополнительные секунды (если ОС выполняет проверку сертификатов в цепочке CRL и OCSP), замедляя загрузку сборки.

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

...