Как подписать exe файл с помощью .NET
От: kong8313  
Дата: 29.03.12 09:03
Оценка:
Всем привет.
Мне надо подписать exe-шник программно без использования signtool.exe (так как его нельзя распространять, а мне надо в ходе инсталляции подписывать файл сертификатом).
Я нашёл способ с использованием SignedCms класса:
private static void SignFile(X509Certificate2 signCertificate, string fileToSign)
{
    var signer = new CmsSigner
    {
        Certificate = signCertificate,                
    };            

    var content = new SignedCms(new ContentInfo(File.ReadAllBytes(fileToSign)));            
    content.ComputeSignature(signer, true);
    byte[] signedFile = content.Encode();

    string signedFileName = fileToSign + ".signed.exe";
    File.Delete(signedFileName);
    File.WriteAllBytes(signedFileName, signedFile);
}


Но проблема в том, что после подписания exe-шник перестаёт запускаться. Пишет

This version of d:\Progi\ConsoleApplicationTest1\ConsoleApplicationTest1\bin\Debug\setup.exe is not compatible with the version of Windows you're running. Check your computer's system information to s
ee whether you need a x86 (32-bit) or x64 (64-bit) version of the program, and then contact the software publisher.

При этом видно, что файл подписывается (изменяется) и есть возможность вернуть его обратно (открыть с помощью SignedCms класса, извлечь подпись и содержимое и сохранить содержимое на диск).
Т.е. складывается впечатление, что exe-шник нельзя подписать с помощью CmsSigner.
Или, может, я делаю что-то не так? Может, кто-нибудь сталкивался с таким и может помочь?

P.S. Ещё нашёл способ с использованием CryptUIWizDigitalSign функции (это WinApi). Но не хотелось бы использовать WinApi, если есть возможность сделать через .NET.
Re: Как подписать exe файл с помощью .NET
От: fddima  
Дата: 29.03.12 10:11
Оценка:
Здравствуйте, kong8313, Вы писали:

K>Мне надо подписать exe-шник программно без использования signtool.exe (так как его нельзя распространять, а мне надо в ходе инсталляции подписывать файл сертификатом).

Как-то странно.

K>Я нашёл способ с использованием SignedCms класса:

Это просто подписывает файл данных.

Думаю смотреть нужно в сторону COM и Alternatives to Using CAPICOM, раздел Digital Signature Objects.
Re[2]: Как подписать exe файл с помощью .NET
От: Tom Россия http://www.RSDN.ru
Дата: 29.03.12 11:06
Оценка:
F> Думаю смотреть нужно в сторону COM и Alternatives to Using CAPICOM, раздел Digital Signature Objects.
Это как я понимаю враперы над CAPICOM, который непонятно можно ли редистрибутить.
Народная мудрось
всем все никому ничего(с).
Re[3]: Как подписать exe файл с помощью .NET
От: fddima  
Дата: 29.03.12 11:18
Оценка:
Здравствуйте, Tom, Вы писали:

F>> Думаю смотреть нужно в сторону COM и Alternatives to Using CAPICOM, раздел Digital Signature Objects.

Tom>Это как я понимаю враперы над CAPICOM, который непонятно можно ли редистрибутить.
Редистрибутить вроде можно (там у них отдельный пакет есть), тем не менее пожалуй лучше не стоит.
Забираю вредный совет обратно.
Re: Как подписать exe файл с помощью .NET
От: hardcase Пират http://nemerle.org
Дата: 29.03.12 12:53
Оценка:
Здравствуйте, kong8313, Вы писали:

K>Всем привет.

K>Мне надо подписать exe-шник программно без использования signtool.exe (так как его нельзя распространять, а мне надо в ходе инсталляции подписывать файл сертификатом).

Гммм а откуда при инсталляции сертификат? И если он уже доступен в инсталляционном пакете, какой тогда сакральный смысл в подписи? Его же оттуда выцепить сможет любой обладатель мозгов и отладчика и подписать что угодно.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Как подписать exe файл с помощью .NET
От: kong8313  
Дата: 30.03.12 10:41
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Гммм а откуда при инсталляции сертификат? И если он уже доступен в инсталляционном пакете, какой тогда сакральный смысл в подписи? Его же оттуда выцепить сможет любой обладатель мозгов и отладчика и подписать что угодно.


Сертификат указывается в ходе инсталляции. А подписывать надо setup.exe, который является стандартным bootstrapper-ом для click once инсталляции. По сути наша инсталляция — это инсталляция файлов для click once инсталляции. Т.к. в ходе инсталляции setup.exe меняется (вызывается с -url=<http path>) с него слетает подпись и требуется его подписать ещё раз. Вот так всё хитро...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.