您是否需要确保没有人修改您的脚本并将其传递为原始脚本?如果是的话,您需要学习如何对 PowerShell 脚本进行签名。签名将发布者的身份添加到脚本中,以便用户可以决定是否信任脚本的来源。
在本文中,学习如何通过学习如何对 PowerShell 脚本进行签名,确保只运行受信任的脚本。
先决条件
如果您要按照本文中的示例进行操作,您需要以下内容。
- A computer running on a recent version of the Windows operating system. This article uses Windows 10 version 20H2.
- Windows PowerShell 5.1 或 PowerShell 6+。本文中的示例将使用 PowerShell v7.1.3。
- A sample PowerShell script for signing. Feel free to create a script with any name and in any folder you want. This article will use a sample script called C:\ATA\myscript.ps1 that contains the code below.
获取代码签名证书
在学习如何对 PowerShell 脚本进行签名之前,您需要先获取一个代码签名证书。在 Microsoft 的世界中,代码签名证书也被称为 Authenticode 证书。
A code signing certificate is one type of digital certificate whose purpose for signing files. Signing a file or code with a code signing certificate adds proof that the file came from the publisher who signed it.
您获取代码签名证书的位置取决于您打算部署或分发已签名脚本的地方。而且,成本也是一个重要因素。
- 全球 / 公共 – 您需要一张由全球信任的 证书颁发机构(CA) 颁发的证书。此类CA的示例包括 GeoTrust 和 DigiCert。这些证书是收费的。例如,截至本文撰写时,DigiCert Authenticode 证书的费用为每年 $474。
- 内部 / 本地内部网 – 如果您有内部证书颁发机构(CA)服务器,您可以从内部CA服务器 请求并下载签名证书。
- 个人 / 开发 – 用于个人测试或开发的目的,自签名证书 应该足够了。这是本文中您将使用的签名证书类型。
为代码签名创建自签名证书
您在前一部分中了解到,在学习如何签署 PowerShell 脚本时,首先需要一张代码签名证书。由于本教程中您只会进行个人测试,因此自签名证书就足够了。但是,您从哪里获取它呢?
顾名思义,自签名意味着您的本地计算机将向自己颁发一张代码签名证书。要生成自签名证书,请按照以下步骤操作。
1. 在您的計算機上以系統管理員身份打開 PowerShell。
2. 複製下面的命令並在 PowerShell 中運行。此命令使用 New-SelfSignedCertificate
cmdlet 創建一個新的代碼簽名證書。證書的名稱是ATA Authenticode,存儲在本地計算機的個人證書存儲中。
New-SelfSignedCertificate
cmdlet 僅支持在當前用戶的個人證書存儲(cert:\CurrentUser\My)或本地計算機的個人證書存儲(cert:\LocalMachine\My)中創建證書。cert:\LocalMachine\My 中的證書能夠在整個計算機上使用。
此命令還將證書對象存儲到 $authenticode
變量中,以供下一步使用。
3. 接下來,為了使您的計算機信任您創建的新證書,將自簽名證書添加到計算機的可信任的根憑證授權機構和可信任的發行者證書存儲中。要這樣做,複製下面的代碼並在 PowerShell 中運行。
將自簽名憑證安裝到三個不同的憑證存儲區有三個主要原因。
- 在 Personal 憑證存儲中創建的憑證是您用作代碼簽名憑證的憑證。
- 將相同的憑證複製到 Trusted Publishers 存儲中可確保本地計算機信任簽署腳本的發行者。PowerShell 檢查此存儲中的憑證以驗證腳本的簽名。
- 最後,將自簽名憑證添加到受信任的根憑證授權可確保您的本地計算機信任個人和受信任的發行者存儲中的憑證。
4. 確認具有主題ATA Authenticode的憑證是否位於個人、根和受信任的發行者憑證存儲中,請在 PowerShell 中運行以下命令。

5. 若要以 GUI 方式查看憑證,請打開憑證管理員,並在個人、受信任的根憑證授權和受信任的發行者憑證存儲中的憑證文件夾中查找您創建的憑證。

如何簽署 PowerShell 指令碼
現在您已經創建並安裝了您的程式碼簽署憑證到三個憑證存儲中,您準備好使用它來簽署您的範例 PowerShell 指令碼了。當您需要簽署指令碼時,Set-AuthenticodeSignature
指令確是主角。
為了簽署 PowerShell 指令碼,請在 PowerShell 中運行以下代碼。第一個命令從本地計算機的個人憑證存儲中獲取程式碼簽署憑證。第二個命令向 PowerShell 指令碼文件添加數字簽名。
大多數值得信賴的證書提供商都有一個時間戳記伺服器,您可以從提供商的網站上找到它們。例如,DigiCert的時間戳記伺服器是http://timestamp.digicert.com,而Comodo則是http://timestamp.comodoca.com。
在簽署腳本之後,您應該會看到與下面螢幕截圖類似的輸出。

檢查 PowerShell 腳本的數位簽署
到目前為止,您使用了自簽名憑證來簽署 PowerShell 腳本。但是,您如何知道該腳本是否具有數位簽署?
打開程式碼
確認腳本的數位簽署的一種方法是打開腳本並在文本編輯器中查看程式碼。就像下面的例子一樣,簽署的腳本在程式碼末尾有一個簽署區塊。該簽署區塊以# SIG # Begin signature block
開始,以# SIG # End signature block
結束。

從腳本的程式碼中刪除數位簽署區塊將將該腳本還原為未簽署狀態。
打開腳本的檔案屬性
檢查腳本的數位簽署的另一種方法是在 Windows Explorer 中打開腳本的檔案屬性。操作如下:
- 在 Windows 資源管理器中,導航至 PowerShell 腳本的位置。在這個例子中,腳本位於 C:\ATA\myscript.ps1。
- 右鍵點擊腳本,然後點擊 屬性。
- 在文件的屬性窗口中,點擊 數位簽章 標籤,您應該在 簽章列表 下看到一個數位簽章。

使用 Get-AuthenticodeSignature
你可能不會感到意外,你也可以在 PowerShell 內部檢查腳本的簽章。您可以調用的 cmdlet 以檢索文件的簽名是 Get-AuthenticodeSignature
。
要獲取腳本的數位簽章,執行以下命令。此命令獲取 C:\ATA\myscript.ps1 文件的簽名。 Select-Object -Property *
cmdlet 顯示簽名的所有細節。
執行命令後,您應該看到類似於下面截圖的結果。正如您所見,SignerCertificate
屬性顯示了簽名憑證的詳細信息。而 TimerStamperCertificate
屬性顯示了時間戳伺服器的證書。

執行簽名的 PowerShell 腳本
到目前為止,您已經簽署了一個 PowerShell 腳本,並確認了數位簽章的存在。但是,確定您是否已經完成了所有步驟的最終測試是執行腳本並確認其運行。
PowerShell 具有一项安全功能,可保护用户免受意外运行脚本的影响。此安全功能称为执行策略。根据执行策略的不同,PowerShell 可能阻止或允许脚本运行。
要了解不同的执行策略以及它们对脚本执行的影响,请参阅PowerShell 执行策略:理解和管理。
要运行已签名的 PowerShell 脚本,请按照以下步骤操作。
首先,将执行策略更改为AllSigned,以确保只有已签名的脚本可以运行。如果不执行此步骤,您无法准确测试已签名脚本的运行情况。为此,请在 PowerShell 中以管理员身份运行以下命令,调用Set-ExecutionPolicy
cmdlet。
接下来,执行已签名的 PowerShell 脚本。
脚本应该正常运行,无错误或警告,如下结果所示。

但是,如果某種方式腳本未正確簽署或根本未簽署,您將收到類似下圖的錯誤。在這種情況下,請重訪您的步驟,並嘗試重新簽署腳本。

如果您最終更新了腳本怎麼辦?數字簽名仍然有效嗎?答案是否定的。對已簽名腳本的任何修改都將使該腳本的數字簽名失效。執行修改後的腳本將失敗並顯示錯誤。
按照以下步驟測試修改後的已簽名腳本。
1. 在代碼或文本編輯器中打開已簽名的 myscript.ps1 腳本。
2. 修改代碼以添加一個字符,例如此示例中的底線。不要更改其他任何內容。

3. 修改代碼後保存腳本。
4. 最後,通過運行以下命令在 PowerShell 中執行修改後的腳本。
由於您修改了已簽名的腳本,執行該腳本將導致顯示下面的錯誤。您需要重新簽署腳本以更新並修復其數字簽名。

A digital signature does not guarantee that nobody modified the script from its original version. Any PowerShell script with malicious code may be digitally signed, too. Always practice caution when running scripts from sources you do not fully trust.
結論
在本文中,您了解到根據執行策略,為什麼可能需要簽署 PowerShell 腳本。您還學會了如何區分已簽名和未簽名的腳本。最後,您學會了如何對 PowerShell 腳本進行數字簽名,以及如何測試和運行它們。
現在你知道如何簽署 PowerShell 指令碼了嗎?在你分發或部署之前,你會開始簽署指令碼嗎?
Source:
https://adamtheautomator.com/how-to-sign-powershell-script/