PowerShell 脚本如何签名

date
Jan 4, 2024
slug
how-to-sign-psscript
status
Published
tags
Powershell
Sign
summary
这段内容讲述了如何使用PowerShell对脚本文件进行数字签名,以确保脚本的完整性和安全性。首先,需要导入数字证书,并使用Set-AuthenticodeSignature命令对脚本进行签名。签名时最好加上时间戳以防止签名过期。另外,还介绍了如何验证文件是否已签名,可以通过get-authenticodeSignature命令或查看文件属性的数字签名来进行验证。签名后,文件内容不能被更改,否则签名状态会变为HashMismatch。
type
Post

TD;DR

$pfxPath$pfxPassword脚本路径修改即可。

背景

由于 powershell 的强大逐渐被人熟知,PS 脚本的使用越来越多。杀软对脚本也青睐有加,所以我们急需对脚本文件进行签名。
脚本文件的签名跟二进制有些许的不一样,如果直接通过 signtool 进行签名,signtool 会提示成功,但实际一点用都没有。

通过内置 cmdlet 来签名

获取数字证书

我们首先要做的就是获取数字证书。数字证书可以来自自签名的,也可以来自证书颁发机构。
我们以证书颁发机构为例:
从本地的 pfx 文件中获取证书,并导入本机。
💡
如果需要采取自签名,可以通过 New-SelfSignedCertificate 来生成,但自签名别的机器默认情况是不认识的。

对脚本签名

一行命令即可:
💡
这里最好是加上时间戳,这样有效期就不会因为证书过期而过期了

怎么验证是否签名

方式一

也可以采用内置 cmdlet (get-authenticodeSignature)来获取签名信息:

方式二:

可以像看二进制一样查看文件属性(文件右击 → 属性 → 数字签名):
notion image

方式三:

用记事本打开 ps1 文件的时候,可以看到签名块:
notion image

注意

签名之后,文件内容是不能被更改的,如果内容更改了,签名状态就会变成 HashMismatch
notion image
 

© Frend Guo 2022 - 2024