Почему мой сертификат нельзя использовать для подписи кода PowerShell?

Windows 7 x64, PowerShell 4.0.

Я новичок в работе с ЭЦП, поэтому раньше читал эти статьи:

Мне нужно подписать мои сценарии PowerShell. Эти сценарии должны быть доступны всем пользователям нашего домена Windows. Но сначала я хочу научиться делать это на своем компьютере.

Я установил политику выполнения на значение AllSigned (с правами администратора):

Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy AllSigned

Согласно статье Дона Джонса, я создал свой собственный сертификат (через командную строку разработчика для VS2015 [то есть через cmd.exe] с правами администратора):

cd c:\temp
makecert -n "CN=Andrey Bushman" -a md5 -r -sv Andrey.Bushman.pvk -ss Root -sr localMachine Andrey.Bushman.cer

Я получил файлы Andrey.Bushman.cer и Andrey.Bushman.pvk в моем текущем каталоге. Первый из них имеет размер 1 кб, а второй — 2 кб. Итак, я вижу, что размер закрытого ключа больше размера сертификата.

Вопрос №1
Означает ли это, что мой сертификат не включает копию моего закрытого ключа?

Теперь я вижу новый элемент в хранилище сертификатов:

PS Cert:\LocalMachine\Root> Get-ChildItem | where -Property Issuer -EQ "CN=Andrey Bushman"

  Directory: Microsoft.PowerShell.Security\Certificate::LocalMachine\Root

Thumbprint                                Subject                                                          
----------                                -------                                                          
CF26A00BB7C8EB2B1EA66CA307C4B5025F636F9A  CN=Andrey Bushman                                                

Затем это сделал Дон Джонс:

makecert -pe -n "CN=MyCertificate" -ss MY 
–a sh1 -eku 1.3.6.1.5.5.7.3.3 -iv root.pvk 
–c root.cer

Вопрос №2
Почему он это сделал? До того, как он это сделал, наш сертификат уже был в хранилище cert:LocalMachine\Root.

По аналогии сделал для своего случая:

makecert -pe -n "CN=Andrey Bushman" -ss MY -a md5 -iv Andrey.Bushman.pvk -ic Andrey.Bushman.cer

Но я ничего не получаю, когда запускаю это:

gci cert:\CurrentUser\My -codesigning

Без флага -codesigning я получаю это:

PS C:\temp> gci cert:\CurrentUser\My

  Directory: Microsoft.PowerShell.Security\Certificate::CurrentUser\My

Thumbprint                                Subject                                                          
----------                                -------                                                          
8F0D753ACA7F6631C3D967921BD06E158E1AB1AF  CN=Andrey Bushman

Вопрос №3
Почему я ничего не получаю, когда использую флаг -codesigning?

Хорошо, я пытаюсь подписать какой-то файл и получаю проблему:

PS C:\temp> $cert = @(gci cert:\CurrentUser\My)[0]

PS C:\temp> Set-AuthenticodeSignature -FilePath .\123.ps1 -Certificate $cert
Set-AuthenticodeSignature : It isn't possible to sign the code. The specified certificate isn't suitable for the code signing
а.
line:1 char:1
+ Set-AuthenticodeSignature -FilePath .\123.ps1 -Certificate $cert
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Set-AuthenticodeSignature], PSArgumentException
    + FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.SetAuthenticodeSignatureCommand

Вопрос № 4
Как сделать мой сертификат пригодным для подписывания кода?

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


person Andrey Bushman    schedule 27.01.2016    source источник
comment
Просто для ясности: powershell.com — это (отличный) сайт сообщества — он никоим образом не является официальным каналом поддержки Microsoft по вопросам, связанным с PowerShell.   -  person Mathias R. Jessen    schedule 27.01.2016
comment
Я это поняла. Но если я не могу зарегистрироваться на этом сайте, я не могу задавать вопросы на их форумах. Восстановление пароля для моей старой учетной записи (для другой электронной почты) тоже не работает.   -  person Andrey Bushman    schedule 27.01.2016


Ответы (1)


Q1: Означает ли это, что мой сертификат не включает копию моего закрытого ключа?

А1: Да. Сертификаты можно менять местами, поскольку они не содержат закрытый ключ. Закрытый ключ обычно существует только на одном компьютере, а резервная копия заархивирована в безопасном месте. Любой, кто получит доступ к закрытому ключу, может подписать все, что захочет, и это будет выглядеть так же, как это сделали вы. (Более полный ответ на этот вопрос выходит за рамки обычной области Stack Overflow, но по PKI доступно много хороших ресурсов.)

Q2: Почему он это сделал?
Q3: Почему я ничего не получаю, когда использую флаг -codesigning?

A2/A3: При первом запуске makecert он создал корневой сертификат. Корневой сертификат предназначен специально для выдачи других сертификатов, поэтому он не отображается как сертификат подписи кода. Во второй раз он делает фактический сертификат. Параметр -eku указывает используемые параметры сертификата, которые могут быть любыми: от корневого сертификата, сертификата подписи кода или цифровой подписи до более сложных вещей, таких как шифрование данных или проверка подлинности клиента.

Q4: Как я могу сделать свой сертификат пригодным для подписи кода?

A4: У меня нет большого опыта работы с makecert.exe, так как у моей компании есть контракт с Cybertrust, согласно которому я могу генерировать столько сертификатов, сколько мне нужно, не беспокоясь о стоимости каждого из них. (Да, это приятная роскошь.) Это означает, что я не могу отвечать на вопросы о makecert.exe, его синтаксисе или используемых опциях -eku.

Во многих отношениях makecert делает для вас много вещей за кулисами, но основные вещи, которые вам нужны, одинаковы:

  1. Вы должны сгенерировать пару открытый/закрытый ключ.
  2. Вы должны создать запрос сертификата, в котором указано «подписание кода».
  3. Вы должны использовать закрытый ключ, чтобы подписать запрос на сертификат.
  4. Центр сертификации использует этот запрос для создания сертификата.
  5. Сгенерированный сертификат может быть установлен только с использованием закрытого ключа, которым был подписан запрос.
  6. После установки сертификата он будет отображаться с опцией -codesigning и будет доступен для использования Set-AuthenticodeSignature.

Я бы предложил использовать документацию makecert и другие ресурсы цифровых сертификатов, чтобы найти правильные варианты, но, судя по моим беглым взглядам на ссылки, которые вы разместили, у вас есть большая часть необходимой информации. Я занимаюсь цифровыми сертификатами уже много лет, и мне кажется, что самое главное, что вам поможет, — это лучше познакомиться с тем, как работает инфраструктура открытых ключей (PKI), особенно в отношении того, как работает и проверяется цепочка сертификатов. Чтобы все это понять, требуется время, а подписывание кода в Powershell — не самое простое место для начала, но если вы собираетесь делать много, это стоит потраченного времени.

person Eric A. Laney    schedule 27.01.2016