为什么我的证书不能用于PowerShell代码签名?

时间:2016-01-27 14:19:30

标签: powershell code-signing code-signing-certificate

Windows 7 x64,PowerShell 4.0。

我是使用数字签名的初学者,因此我之前阅读了这些文章:

我需要签署我的PowerShell脚本。我们的Windows域的所有用户都可以访问这些脚本。但起初我想学习在我的电脑上做这件事。

我将执行策略设置为AllSigned值(具有管理员权限):

Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy AllSigned

根据Don Jones的文章,我创建了自己的证书(通过 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.cerAndrey.Bushman.pvk个文件。第一个大小为1 kb,第二个大小为2 kb。所以,我看到私钥大小超过证书大小。

问题#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

但是当我启动它时,我得到 nothing

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
我不能问我的问题here,因为我无法在该网站上注册(我的电子邮件中没有任何内容)。我写信给支持团队的电子邮件,但他们从不回答。我几年前尝试过这样做,并且我几天前尝试再做一次,但我得到的结果相同。

1 个答案:

答案 0 :(得分:2)

  

Q1:这是否意味着我的证书不包含我的私钥副本?

A1:是的。证书可以围绕进行交换,因为它们不包含私钥。私钥通常仅存在于一台计算机上,备份副本存档在安全位置。任何能够访问私钥的人都可以签署任何他们想要的东西,看起来就像你做的那样。 (对此问题的更完整答案超出了Stack Overflow的典型范围,但PKI上有许多可用的资源。)

  

Q2:他为什么这样做?   问题3:当我使用-codesigning标志时,为什么我什么也得不到?

A2 / A3:他第一次跑makecert时,他创建了根证书。根证书专门用于颁发其他证书,这就是它不会显示为代码签名证书的原因。第二次,他正在制作实际的证书。 -eku选项指定要使用的证书选项,可以是从根证书,代码签名证书或数字签名到数据加密或客户端身份验证等更高级的东西。

  

问题4:如何使我的证书适合代码签名?

A4:我对makecert.exe没有很多经验,因为我的公司与Cyber​​trust签订了合同,这样我可以生成尽可能多的证书,而不必担心每个证书的成本。 (是的,这是一个很好的奢侈品。)这意味着我无法回答有关makecert.exe,其语法或-eku选项的问题。

在很多方面,makecert在幕后为你做了很多事情,但你需要的基本内容是相同的:

  1. 您必须生成公钥/私钥对。
  2. 您必须创建一个指定“代码签名”的证书请求。
  3. 您必须使用私钥对证书申请进行签名。
  4. 证书颁发机构使用该请求生成证书。
  5. 生成的证书只能使用签署请求的私钥安装。
  6. 安装证书后,它将显示-codesigning选项,并可由Set-AuthenticodeSignature使用。
  7. 我建议使用makecert文档和其他数字证书资源来查找正确的选项,但根据我对您发布的链接的快速浏览,您似乎拥有所需的大部分信息。多年以来,我已经完成了数字证书,在我看来,帮助您的最重要的事情就是更熟悉公钥基础设施(PKI)的工作方式,特别是关于证书链如何工作和验证。要把它全部搞砸需要时间,并且Powershell中的代码签名不是最容易开始的地方,但是如果你要做很多事情,那么值得投入时间。