您的当前位置:首页正文

对PowerShell代码进行签名

2020-03-02 来源:客趣旅游网
给PowerShell脚本签名

如何启动证书管理器:

 启动cmd,运行mmc,启动Microsoft管理控制台  文件 – 添加/删除管理单元,选择到“证书”,点击“添加”

 选择账户(我的用户账户或者计算机账户)

1 使用makecert创建根证书

1.1 以管理员身份运行powershell

注:也可以使用cmd,这里都将使用powershell

1.2 切换到makecert所在目录

安装了Visual Studio就会有。路径参考如下:

C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.15063.0\\x64

注意:这里用的是x64目录下的makecert.exe,在x86目录下同样也有makecert.exe。

1.3 创建根证书

参考代码:

.\\makecert.exe -n \"CN=DHDRoot\" -a sha1 -r -ss Root -sr LocalMachine -eku 1.3.6.1.5.5.7.3.3 -sv D:\\Cer\\DHD.pvk D:\\Cer\\DHD.cer 代码解释:

 -n “CN=XXXX”

指定主题的证书名称。这是个固定格式,其中XXXX就是你要设定的证书名称。可以带空格,可以是中文。比如: -n “CN=宁夏 固原”。范例中的证书名,体现在证书管理器如下图所示:

 -a sha1

指定证书的签名算法。md5或者sha1二选一。默认为md5  -r

表示创建自签署证书  -ss

表示指定主题的证书存储名称。既输出的证书存储在哪里。也就是我们在证书管理器里看到的“个人”、“企业信任”、“受信任人”等。可以在PowerShell中通过以下方式获取这些名称: ls Cert:\\LocalMachine

这是列出本地计算机里的证书存储位置。自然也可以列出当前用户的证书存储位置: ls Cert:\\CurrentUser  -sr

表示指定主题的证书存储位置。值可以值currentuser或者localmachine  -eku

表示用逗号分隔的增强型密钥用法对象标识符 (OID)。这是指定该密钥的预期目的是代码签名的关键部分。必须是如下值: 1.3.6.1.5.5.7.3.3

 -sv

指定主题的 .pvk 私钥文件。如果该文件不存在,系统将创建一个。

这是需要注意:如果不指定pvk文件的路径,那么就是在powershell的当前上下文目录中创建。在例子中,我们将创建路径指定到了D:\\Cer\\

执行如下图的代码:

首先是创建了一个私钥文件,弹出密码设定对话框,我们需要在该对话框中设定一个新的密码:

在接着弹出的对话框中(导入证书),输入刚才设定的密码:

此时,ps会提示证书安装成功。

此时,我们就可以在证书管理工具中看到我们创建的根证书:

或者通过ps查看:

切换到我们指定的私钥文件路径,可以看到生成了如下的文件:

2 使用makecert根据根证书创建代码签名证书

makecert -pe -n \"CN=PowerShell User\" -ss MY -a sha1 -eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer

代码解释(参数相同部分忽略):

 -pe

将所生成的私钥标记为可导出。这样可将私钥包括在证书中。  -iv

指定颁发者的 .pvk 私钥文件。就是我们之前生成的.pvk文件  -ic

指定颁发者的证书文件。就是我们之前生成的.cer文件

在ps中执行代码。首先要求输入私钥文件的密码。如果提示Succeeded,表示安装成功。此时可以通过ls来查看。如下图所示:

或者通过证书管理工具查看:

3 对ps代码进行签名

3.1 写一个简单的ps脚本,输出当前时间并暂停。内容如下:

3.2 使用Set-AuthenticodeSignature对脚本文件进行签名(此时不需要管理员权限):

首先我们获取到刚才创建的签名证书并保存到变量中:

$cer = (ls Cert:\\LocalMachine\\TrustedPublisher | Where-Object{$_.Subject -like '*DHD*'})[0]

使用Set-AuthenticodeSignature命令对脚本文件进行签名:

Set-AuthenticodeSignature -PSPath \"D:\\Cer\\Install.ps1\" -Certificate $cer

状态中提示Valid,表示签名成功。此时我们打开脚本,可以看到在我们的脚本末尾,多了一些签名内容:

4 执行脚本

4.1 查看默认的脚本执行策略

我们可以通过Get-ExecutionPolicy来查看Powershell的脚本执行策略。默认是禁止脚本执行的,既值为:Restricted。 我们将脚本的执行策略修改为AllSigned,既允许所有签名的脚本执行: Set-ExecutionPolicy AllSigned

注意:该操作需要管理员权限运行ps

我们可以通过如下方式,列举中所有脚本执行策略的名称: [System.Enum]::GetNames([Microsoft.PowerShell.ExecutionPolicy])

4.2 执行脚本

可以通过右击脚本文件 -“使用PowerShell运行”或者启动PowerShell,将文件拖拽的PowerShell中。

脚本正常执行。

如果我们对脚本内容做一下修改,然后执行,会发生什么呢?

直接修改脚本内容:

执行脚本:

可以看到,报错了。因为签名之后的文件内容发生了变化,与已经存在的签名内容的哈希值不同。所以脚本不会执行。

脚本内容发生变化之后,需要对脚本重新签名

5 部署到其它计算机

如果目标算机的脚本执行策略也是需要签名,那要执行前面签名的脚本,就需要将证书安装到目标。

5.1 导出证书

 启动证书管理工具

 导航到我们之前生成的代码签名证书,右键-所有任务-导出

 选择导出私钥

 选择“数据包括证书路径中的所有证书”

 设置密码。该密码是目标计算机上安装证书时使用。

 设置存储位置

 完成导出

5.2 安装证书

 将证书文件拷贝到目标计算机。  右键-安装PFX

 选择证书存储位置(这是Server 2012下的测试,Win7下可能无此选项)

 文件名,既我们要导出的证书。

 密码。既导出证书时设置的密码。

 设置证书存储。这里我们设置为自动选择。

 完成导入

导入完成之后,启动目标计算机的证书管理器,查看证书的导入情况:

与原证书结构不同的是,DHD Powershell的签名证书放在了个人目录下。

我们将目标机器的脚本执行策略设置为AllSigned,然后执行脚本。出现如下警告:

选择运行一次,结果如下:

之所以出现这个提示,是因为我们创建的DHD Powershell证书是放在个人目录下。我们将它移到“受信任的发布者”(直接拖拽即可),然后执行脚本,发现没有这个警告了,脚本直接运行。

参考资料:

https://msdn.microsoft.com/zh-cn/library/bfsktky3(VS.80).aspx:证书创建工具Makecert.exe使用

https://stackoverflow.com/questions/10937065/signtool-allows-me-to-sign-code-but-set-authenticodesignature-says-the-certific

因篇幅问题不能全部显示,请点此查看更多更全内容