about_Signing

適用於: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

主題

about_Signing

簡短描述

說明如何簽署指令碼,以使其符合 Windows PowerShell® 執行原則。

詳細描述

Restricted 執行原則不允許任何指令碼執行。AllSigned 和 RemoteSigned 執行原則會防止 Windows PowerShell 執行沒有數位簽章的指令碼。

本主題說明如何執行未簽署的選定指令碼 (即使是在執行原則為 RemoteSigned 時),以及如何簽署指令碼供自己使用。

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

允許已簽署的指令碼執行

當您第一次在電腦上啟動 Windows PowerShell 時,Restricted 執行原則 (預設值) 可能正在作用中。

Restricted 原則不允許任何指令碼執行。

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

        Get-ExecutionPolicy

若要執行您在本機電腦上撰寫的未簽署指令碼,以及來自其他使用者的已簽署指令碼,請使用 [以系統管理員身分執行] 選項來啟動 Windows PowerShell,然後使用下列命令,將電腦上的執行原則變更為 RemoteSigned:

        Set-ExecutionPolicy RemoteSigned

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

執行未簽署的指令碼 (REMOTESIGNED 執行原則)

如果您的 Windows PowerShell 執行原則是 RemoteSigned,Windows PowerShell 將不會執行從網際網路下載的未簽署指令碼,包括透過電子郵件和即時訊息程式收到的未簽署指令碼。

如果您嘗試執行下載的指令碼,Windows 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.

在執行指令碼之前,請檢閱程式碼,以確定您信任它。指令碼具有與任何可執行程式相同的效果。

  • 1. 將指令碼檔案儲存在您的電腦上。

  • 2. 依序按一下 [開始]、[我的電腦],然後尋找所儲存的指令碼檔案。

  • 3. 用滑鼠右鍵按一下指令碼檔案,然後按一下 [屬性]。

  • 4. 按一下 [解除封鎖]。

如果從網際網路下載的指令碼已經有數位簽章,但您尚未選擇信任其發行者,Windows PowerShell 會顯示下列訊息:

  • 您要執行這個不受信任的發行者提供的軟體嗎?檔案 <檔案名稱> 是由 CN=<發行者名稱> 發行。這個發行者在您的系統上不受信任。請只執行來自受信任的發行者的指令碼。

  • [V] 永不執行 [D] 不執行 [R] 執行一次 [A] 一律執行 [?] 說明 (預設值為 "D"):

  • 如果您信任發行者,請選取 [立即一次] 或 [一律執行]。如果您不信任發行者,請選取 [永不執行] 或 [不執行]。如果您選取 [永不執行] 或 [一律執行],Windows PowerShell 將不會再針對這個發行者提示您。

簽署指令碼的方法

您可以簽署您撰寫的指令碼,以及從其他來源取得的指令碼。在簽署任何指令碼之前,請檢查每個命令,以確認其安全可執行。

如需有關簽署程式碼的最佳作法,請參閱<程式碼簽署最佳作法>,網址為:https://go.microsoft.com/fwlink/?LinkId=119096。

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

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

若要新增數位簽章至指令碼,您必須使用程式碼簽署憑證來加以簽署。適合用來簽署指令碼檔案的憑證有兩種類型:

  • -- 憑證授權單位建立的憑證:

    您可以付費請公開憑證授權單位驗證您的身分識別,並提供您程式碼簽署憑證。如果您向信用可靠的憑證授權單位購買憑證,就可以在執行 Windows 的其他電腦上,與其他使用者共用您的指令碼,因為這些其他電腦信任該憑證授權單位。

  • -- 您建立的憑證:

    您可以建立自我簽署的憑證,您的電腦就是建立該憑證的授權單位。此憑證免費,並可讓您在您的電腦上撰寫、簽署及執行指令碼。不過,由自我簽署憑證所簽署的指令碼不會在其他電腦上執行。

通常自我簽署的憑證只會用來簽署您撰寫供自己使用的指令碼,以及簽署您從其他確認安全的來源取得的指令碼。它並不適用於要共用的指令碼,即使是在企業內部也不適合。

如果您建立自我簽署的憑證,請務必在您的憑證上啟用加強私密金鑰保護。這可以防止惡意程式以您的名義簽署指令碼。相關指示包含在本主題結尾處。

建立自我簽署的憑證

若要建立自我簽署的憑證,請使用 PKI 模組中的 New-SelfSignedCertificate Cmdlet。此模組在 Windows PowerShell 3.0 中引進,並包含在 Windows 8 和 Windows Server 2012 中。如需詳細資訊,請參閱 New-SelfSignedCertificate Cmdlet 的說明主題。

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

如需 MakeCert.exe 工具的語法和參數描述詳細資訊,請參閱 MSDN (Microsoft Developer Network) Library 中的<憑證建立工具 (MakeCert.exe)>,網址為 https://go.microsoft.com/fwlink/?LinkId=119097。

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

注意:第一個命令會建立您電腦的本機憑證授權單位。第二個命令會從憑證授權單位產生個人憑證。

注意:您可以複製或完全依照其顯示的方式輸入命令。不需要替換任何項目,但您可以變更憑證名稱。

            makecert -n "CN=PowerShell Local Certificate Root" -a sha1 `
                -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 sha1 `
                -eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer

MakeCert.exe 工具會提示您輸入私密金鑰密碼。密碼可確保沒有人可以未經您同意而使用或存取憑證。建立並輸入您可以記住的密碼。您之後將會使用這個密碼來擷取憑證。

若要確認憑證已正確產生,請使用下列命令,在電腦的憑證存放區中取得憑證。(您在檔案系統目錄中找不到憑證檔案。)

在 Windows PowerShell 提示中輸入:

            get-childitem cert:\CurrentUser\my -codesigning

此命令會使用 Windows PowerShell 憑證提供者來檢視憑證的相關資訊。

如果已建立憑證,則輸出會在顯示畫面中顯示識別憑證的憑證指紋,如下所示:

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

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

簽署指令碼

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

下列指令碼範例 Add-Signature.ps1 會簽署指令碼。不過,如果您是使用 AllSigned 執行原則,則必須先簽署 Add-Signature.ps1,才能加以執行。

若要使用這個指令碼,請將下列文字複製到文字檔,並將其命名為 Add-Signature.ps1。

注意:請確定指令碼檔案沒有 .txt 副檔名。如果您的文字編輯器附加了 ".txt",請用引號括住檔案名稱:"add-signature.ps1"。

            ## 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 指令碼檔案,請在 Windows PowerShell 命令提示字元輸入下列命令:

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

簽署指令碼之後,您可以在本機電腦上執行它。不過,如果電腦上的 Windows PowerShell 執行原則需要受信任的授權單位提供數位簽章,則無法在該電腦上這個指令碼。如果您嘗試執行,Windows 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 <<<<

如果執行不是您撰寫的指令碼時,Windows PowerShell 顯示此訊息,請將檔案當做任何未簽署的指令碼來處理。檢閱程式碼,以判斷您是否可以信任該指令碼。

為您的憑證啟用加強私密金鑰保護

如果您的電腦上有私人憑證,惡意程式可能會用您的名義簽署指令碼,進而授權 Windows PowerShell 來執行那些指令碼。

若要防止以您的名義自動簽署,請使用憑證管理員 (Certmgr.exe),將您的簽署憑證匯出至 .pfx 檔案。憑證管理員包含在 Microsoft .NET Framework SDK、Microsoft Windows SDK,以及 Internet Explorer 5.0 和更新版本中。

若要匯出憑證,請執行下列步驟:

  • 1. 啟動 [憑證管理員]。

  • 2. 選取 PowerShell 本機根憑證所發出的憑證。

  • 3. 按一下 [匯出],以啟動 [憑證匯出精靈]。

  • 4. 選取 [是,匯出私密金鑰],然後按 [下一步]。

  • 5. 選取 [啟用加強保護]。

  • 6. 輸入密碼,然後再輸入一次確認。

  • 7. 輸入副檔名為 .pfx 的檔案名稱。

  • 8. 按一下 [完成]。

若要重新匯入憑證,請執行下列步驟:

  • 1. 啟動 [憑證管理員]。

  • 2. 按一下 [匯入],以啟動 [憑證匯入精靈]。

  • 3. 開啟您在匯出程序期間建立之 .pfx 檔案的位置。

  • 4. 在 [密碼] 頁面上選取 [啟用加強私密金鑰保護],然後輸入您在匯出程序期間指派的密碼。

  • 5. 選取 [個人憑證存放區]。

  • 6. 按一下 [完成]。

防止簽章過期

指令碼中的數位簽章有效至簽章憑證過期,或只要時間戳記伺服器可以確認在簽署憑證有效期間已簽署指令碼即可。

因為大部分簽署憑證的有效期限只有一年,所以使用時間戳記伺服器可確保使用者未來好幾年都可以使用您的指令碼。

另請參閱

about_Execution_Policies

about_Profiles

Get-ExecutionPolicy

New-SelfSignedCertificate

Set-ExecutionPolicy

Set-AuthenticodeSignature

<程式碼簽署簡介>(https://go.microsoft.com/fwlink/?LinkId=106296)