關於簽署

簡短描述

說明如何簽署腳本,使其符合PowerShell執行原則。

完整描述

此資訊僅適用於在 Windows 上執行的 PowerShell。

Restricted execution 策略不允許運行任何腳本。 AllSigned 和 RemoteSigned 執行策略會阻止 PowerShell 執行沒有數位簽名的腳本。

本主題說明如何運行未簽名的選定腳本,即使執行策略為 RemoteSigned,以及如何為腳本簽名以供自己使用。

如需 PowerShell 執行原則的詳細資訊,請參閱 about_Execution_Policies。

允許已簽名的腳本運行

首次在計算機上啟動 PowerShell 時, 受限 執行策略(預設)可能生效。

Restricted 策略不允許運行任何腳本。

若要在您的電腦上尋找有效的執行原則,請輸入:

Get-ExecutionPolicy

要執行您在本地電腦上編寫的未簽名腳本以及來自其他使用者的簽名腳本,請使用 Run as Administrator (以管理員身份運行) 選項啟動 PowerShell,然後使用以下命令將電腦上的執行策略更改為 RemoteSigned:

Set-ExecutionPolicy RemoteSigned

如需詳細資訊,請參閱 Set-ExecutionPolicy Cmdlet 的說明主題。

使用 RemoteSigned 執行策略運行未簽名的腳本

如果您的PowerShell執行策略是 RemoteSigned,則PowerShell將不會運行從Internet 下載的未簽名腳本,包括您通過電子郵件和即時消息程式收到的未簽名腳本。

如果您試著執行下載的文稿,PowerShell 會顯示下列錯誤訊息:

The file <file-name> cannot be loaded. The file <file-name> is not digitally
signed. The script will not execute on the system. Please see "Get-Help
about_Signing" for more details.

執行文稿之前,請先檢閱程式代碼,確定您信任它。 腳本與任何可執行程式的效果相同。

要運行未簽名的腳本,請使用 Unblock-File cmdlet 或使用以下過程。

  1. 將腳本檔案儲存在您的電腦上。
  2. 單擊 Start,按下 My Computer,然後找到保存的腳本檔。
  3. 右鍵按下腳本檔,然後按下 Properties (屬性)。
  4. 按兩下 Unblock(取消阻止)。

如果從 Internet 下載的文稿已經過數位簽名,但您尚未選擇信任其發行者,則 PowerShell 將顯示以下訊息:

Do you want to run software from this untrusted publisher?
The file <file-name> is published by CN=<publisher-name>. This
publisher is not trusted on your system. Only run scripts
from trusted publishers.

[V] Never run  [D] Do not run  [R] Run once  [A] Always run
[?] Help (default is "D"):

如果您信任發行者,請選擇“Run once”或“Always run”。如果您不信任發行者,請選擇“從不運行”或“不運行”。如果選擇「從不運行」或「始終運行」 ,PowerShell 將不會再次提示你使用此發行者。

簽署腳本的方法

您可以對編寫的文稿和從其他源獲取的腳本進行簽名。 在對任何腳本進行簽名之前,請檢查每個命令以驗證它是否可以安全運行。

有關代碼簽名的最佳實踐,請參閱 Code-Signing 最佳實踐。

如需如何簽署文稿檔案的詳細資訊,請參閱 Set-AuthenticodeSignature。

PowerShell 3.0 的 PKI 模組中引入的 New-SelfSignedCertificate cmdlet 會創建適合測試的自簽名證書。 有關詳細資訊,請參閱 New-SelfSignedCertificate cmdlet 的幫助主題。

若要將數位簽名新增至腳本,您必須使用程式代碼簽署憑證簽署它。 兩種類型的憑證適用於簽署腳本檔案:

  • 由證書頒發機構建立的憑證:支付費用後,公共證書頒發機構會驗證您的身分,並提供程式碼簽署憑證。 當您從信譽良好的證書頒發機構單位購買憑證時,您可以與其他執行 Windows 的電腦上用戶共用腳本,因為這些其他電腦信任證書頒發機構單位。

  • 您所建立的憑證:您可以建立一個由您的電腦作為憑證授權機關的自簽憑證。 此憑證是免費的,可讓您在計算機上撰寫、簽署和執行腳本。 不過,由自我簽署憑證簽署的腳本將不會在其他計算機上執行。

通常,您只使用自簽名證書對編寫的供自己使用的腳本進行簽名,以及對從其他來源獲取的已驗證為安全的腳本進行簽名。 它不適用於將要共用的腳本,即使在企業內部也是如此。

如果您建立自我簽署憑證,請務必在您的憑證上啟用強式私鑰保護。 這可防止惡意程式代表您簽署腳本。 本主題結尾會包含這些指示。

建立自我簽署憑證

若要創建自簽名證書,請使用 New-SelfSignedCertificate PKI 模組中的 cmdlet。 此模組在PowerShell 3.0中引入,並包含在Windows 8和 Windows Server 2012 中。 如需詳細資訊,請 參閱 New-SelfSignedCertificate。

$params = @{
    Subject = 'CN=PowerShell Code Signing Cert'
    Type = 'CodeSigning'
    CertStoreLocation = 'Cert:\CurrentUser\My'
    HashAlgorithm = 'sha256'
}
$cert = New-SelfSignedCertificate @params

使用 Makecert.exe

若要在舊版 Windows 中建立自我簽署憑證,請使用憑證建立工具 MakeCert.exe。 此工具包含在 Microsoft .NET SDK 中(1.1 版和更新版本)和 Microsoft Windows SDK 中。

如需 MakeCert.exe 工具語法和參數描述的詳細資訊,請參閱 憑證建立工具 (MakeCert.exe)。

若要使用 MakeCert.exe 工具來建立憑證,請在 SDK 命令提示字元視窗中執行下列命令。

備註

第一個命令會為您的電腦建立本地認證機構。 第二個命令會從證書頒發機構生成個人憑證。 您可以複製或鍵入命令,就像它們出現一樣。 雖然您可以變更憑證名稱,但不需要替代。

makecert -n "CN=PowerShell Local Certificate Root" -a sha256 `
-eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer `
-ss Root -sr localMachine

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

該工具 MakeCert.exe 將提示您輸入私鑰密碼。 密碼可確保沒有人可以在未經您的同意的情況下使用或存取憑證。 建立並輸入您可以記住的密碼。 您稍後將使用此密碼來檢索證書。

若要驗證證書是否已正確生成,請使用以下命令在電腦上的證書存儲中獲取證書。 在檔案系統目錄中找不到證書檔。

在 PowerShell 命令提示符中,輸入:

Get-ChildItem cert:\CurrentUser\my -codesigning

此命令會使用PowerShell憑證提供者來檢視憑證的相關信息。

如果已建立憑證,輸出會顯示 指紋, 識別顯示中類似如下的憑證:

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

Thumbprint                                Subject
----------                                -------
4D4917CB140714BA5B81B96E0B18AAF2C4564FDF  CN=PowerShell User ]

簽署腳本

建立自我簽署憑證之後,您可以簽署腳本。 如果您使用 AllSigned 執行原則,簽署腳本可讓您在電腦上執行腳本。

下列範例腳本 Add-Signature.ps1簽署腳本。 不過,如果您使用 AllSigned 執行原則,您必須在執行腳本之前,先簽署 Add-Signature.ps1 腳本。

這很重要

必須使用 ASCII 或 UTF8NoBOM 編碼保存腳本。 您可以對使用不同編碼的腳本文件進行簽名,但腳本無法運行或包含該腳本的模組無法導入。 如果檔包含 Unicode (UTF8) 字元,則腳本也會失敗。

若要使用此文稿,請將下列文字複製到文字檔,並將它命名為 Add-Signature.ps1。

## Signs a file
param([string] $file=$(throw "Please specify a filename."))
$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
Set-AuthenticodeSignature $file $cert

若要簽署 Add-Signature.ps1 文稿檔案,請在 PowerShell 命令提示字元中輸入下列命令:

$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]
Set-AuthenticodeSignature add-signature.ps1 $cert

對文稿進行簽名后,您可以在本地電腦上運行它。 但是,該腳本不會在PowerShell執行策略需要來自受信任頒發機構的數位簽名的電腦上運行。 如果您嘗試,PowerShell 會顯示下列錯誤訊息:

The file C:\remote_file.ps1 cannot be loaded. The signature of the
certificate cannot be verified.
At line:1 char:15
+ .\ remote_file.ps1 <<<<

如果 PowerShell 在執行未編寫的腳本時顯示此消息,請像處理任何未簽名的腳本一樣處理該檔。 檢閱程式代碼,以判斷您是否可以信任腳本。

為您的私鑰啟用強式保護

如果您的電腦上有私鑰和憑證,惡意程式可能會代表您簽署腳本,以授權 PowerShell 執行這些腳本。

若要防止代表您進行自動簽署,請使用憑證管理員 Certmgr.exe 將簽署密鑰和憑證導出至 .pfx 檔案。 憑證管理員包含在 Microsoft .NET SDK、Microsoft Windows SDK 和 Internet Explorer 中。

若要匯出憑證:

  1. 啟動憑證管理員。
  2. 選取由 PowerShell 本機憑證根目錄簽發的憑證。
  3. 按兩下 Export 以啟動證書匯出精靈。
  4. 選擇“Yes, export the private key”,然後按兩下 Next。
  5. 選擇「啟用強保護」。。
  6. 輸入密碼,然後再次輸入密碼以確認。
  7. 鍵入具有 .pfx 檔擴展名的檔名。
  8. 按一下 [完成]。

若要重新匯入憑證:

  1. 啟動憑證管理員。
  2. 按兩下 Import 以啟動 Certificate Import Wizard。
  3. 打開您在匯出過程中建立的 .pfx 檔案的位置。
  4. 在 Password 頁面上,選擇“Enable strong private key protection”,然後輸入您在導出過程中分配的密碼。
  5. 選擇 Personal certificate store (個人證書存儲)。
  6. 按一下 [完成]。

防止簽章過期

腳本中的數字簽名有效,直到簽署憑證到期,或只要時間戳伺服器可以在簽署憑證有效時驗證腳本是否已簽署。

由於大多數簽署憑證只有效一年,因此使用時間戳伺服器可確保使用者在未來幾年內可以使用您的腳本。

另請參閱