共用方式為


about_Signing

簡短描述

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

詳細描述

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

受限制的執行原則不允許任何腳本執行。 AllSigned 和 RemoteSigned 執行原則會防止 PowerShell 執行沒有數位簽名的腳本。

本主題說明如何執行未簽署的選取腳本,即使執行原則為 RemoteSigned,以及如何簽署腳本以供您自己的使用。

PowerShell 會檢查下列類型類型的 Authenticode 簽章:

  • .ps1 腳本檔案
  • .psm1 模組檔案
  • .psd1 模組指令清單和數據檔
  • .ps1xml 類型及格式 XML 檔案
  • .cdxml CDXML 腳本檔案
  • .xaml XAML 腳本檔案

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

允許簽署的腳本執行

當您第一次在計算機上啟動PowerShell時, 預設為預設值的受限制 執行原則可能會生效。

受限制的原則不允許執行任何腳本。

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

Get-ExecutionPolicy

若要在本機計算機上執行未簽署的腳本,並從其他使用者簽署腳本,請使用 [以系統管理員身分執行] 選項啟動 PowerShell,然後使用下列命令,將計算機上的執行原則變更為 RemoteSigned

Set-ExecutionPolicy RemoteSigned

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

使用 RemoteSigned 執行原則執行未簽署的腳本

如果您的PowerShell執行原則是 RemoteSigned,PowerShell將不會執行從因特網下載的未簽署腳本,包括您透過電子郵件和立即訊息程式收到的未簽署腳本。

如果您試著執行下載的文稿,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. 按兩下 [ 開始],按兩下 [ 我的電腦],然後找出儲存的腳本檔案。
  3. 以滑鼠右鍵按下腳本檔案,然後按兩下 [ 屬性]。
  4. 按兩下 [ 解除封鎖]。

如果從因特網下載的腳本經過數字簽署,但您尚未選擇信任其發行者,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"):

如果您信任發行者,請選取 [執行一次] 或 [一律執行]。 如果您不信任發行者,請選取 [永不執行 ] 或 [不要執行]。 如果您選取 [ 永不執行 ] 或 [永遠執行],PowerShell 將不會再次提示您輸入此發行者。

簽署腳本的方法

您可以簽署您撰寫的腳本,以及您從其他來源取得的腳本。 簽署任何文稿之前,請先檢查每個命令,以確認執行是否安全。

如需程式代碼簽署的最佳做法,請參閱 程式代碼簽署最佳做法

如需如何簽署腳本檔案的詳細資訊,請參閱 Set-AuthenticodeSignature

PowerShell New-SelfSignedCertificate 3.0 的 PKI 模組中引進的 Cmdlet 會建立適合測試的自我簽署憑證。 如需詳細資訊,請參閱 Cmdlet 的說明 New-SelfSignedCertificate 主題。

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

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

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

一般而言,您只會使用自我簽署憑證來簽署您自行撰寫的腳本,以及簽署您從已驗證為安全的其他來源取得的腳本。 它不適用於將共用的腳本,即使在企業內也是如此。

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

建立自我簽署憑證

若要建立自我簽署憑證,請使用 PKI 模組中的 New-SelfSignedCertificate Cmdlet。 本課程模組是在PowerShell 3.0中引進的。 如需詳細資訊,請參閱 Cmdlet 的說明 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 才能執行腳本。

重要

在 PowerShell 7.2 之前,腳本必須使用 ASCII 或 UTF8NoBOM 編碼來儲存。 PowerShell 7.2 和更新版本支援任何編碼格式的已簽署腳本。

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

## Signs a file
[cmdletbinding()]
param(
    [Parameter(Mandatory=$true)]
    [string] $File
)

$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert |
    Select-Object -First 1

Set-AuthenticodeSignature -FilePath $File -Certificate $cert

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

$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert |
    Select-Object -First 1

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. 按兩下 [ 導出 ] 以啟動 [憑證導出精靈]。
  4. 選取 [是,匯出私密金鑰],然後按 [下一步]
  5. 選取 [ 啟用強式保護]。
  6. 輸入密碼,然後再次輸入密碼以確認。
  7. 輸入擴展名為 .pfx 的檔名。
  8. 按一下完成

若要重新匯入憑證:

  1. 啟動憑證管理員。
  2. 按兩下 [ 入] 以啟動 [憑證匯入精靈]。
  3. 開啟至您在匯出程式期間建立的 .pfx 檔案位置。
  4. 在 [密碼] 頁面上,選取 [ 啟用強式私鑰保護],然後輸入您在匯出程式期間指派的密碼。
  5. 選取 [個人] 憑證存放區。
  6. 按一下完成

防止簽章過期

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

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

另請參閱