Как мне прочитать открытый ключ из подписанного C # EXE - PullRequest
6 голосов
/ 16 сентября 2010

Я подписываю dot net exe, используя

signcode.exe with an spc/pvk combo

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

Я пробовал

X509Certificate executingCert = X509Certificate.CreateFromSignedFile(exe);

executingCert тогда равен нулю. Я предполагаю, что signcode не создает файл с подписью X509, хотя, если есть переключатель, который я могу изменить, я рад пойти по этому пути.

изм Оказывается, вышеописанное работает ... У меня была нулевая проверка назад (! =! = ==) :)

Assembly asm = Assembly.GetExecutingAssembly();
string exe = asm.Location;
X509Certificate executingCert = X509Certificate.CreateFromSignedFile(exe); 

if (executingCert != null)
{
    Console.WriteLine("Assembly is signed");
    byte[] assemblyKey = executingCert.GetPublicKey();
}

Ответы [ 2 ]

3 голосов
/ 17 сентября 2010

SignCode (для .Net 1.0 и 1.1) использует подпись Authenticode, которой, насколько мне известно, не хватает управляемого интерфейса .Net Framework. Скорее всего, вам потребуется использовать P / Invoke для вызова подпрограмм в Win32 API, таких как те, которые описаны в этой статье КБ: Как получить информацию из подписанных исполняемых файлов Authenticode . Скорее всего, вам нужно будет использовать CryptQueryObject , который даст вам сертификат, из которого вам, вероятно, придется найти другую подпрограмму для извлечения открытого ключа.

Проверьте этот связанный вопрос StackOverflow, на который есть много ответов: WinVerifyTrust для проверки конкретной подписи?

0 голосов
/ 16 сентября 2010

Попробуйте что-то подобное:

Assembly.GetEntryAssembly().GetName().GetPublicKey()

В этом случае я использовал GetEntryAssembly, но, конечно, вы можете вызвать метод для любой загруженной сборки.

...