about_Signing
主題
about_signing
簡短描述
說明如何簽署指令碼,使其符合 Windows PowerShell 執行原則。
完整描述
Restricted 執行原則不會允許任何指令碼執行。
AllSigned 和 RemoteSigned 執行原則禁止 Windows PowerShell 執行沒有數位簽章的指令碼。
本主題說明如何執行選取的未經簽署指令碼 (即使在執行原則為 RemoteSigned 時也一
樣),以及如何簽署指令碼供您自己使用。
如需 Windows PowerShell 執行原則的詳細資訊,請參閱 about_Execution_Policy。
若要允許執行已簽署的指令碼
-------------------------------
當您第一次在電腦上啟動 Windows PowerShell 時,可能會實行 Restricted 執行原則 (預設
值)。
Restricted 原則不會允許任何指令碼執行。
若要找出電腦上的有效執行原則,請輸入:
get-executionpolicy
若要執行您在本機電腦撰寫的未經簽署指令碼,以及其他使用者提供的已簽署指令碼,請使
用下列命令將電腦的執行原則變更為 RemoteSigned:
set-executionpolicy remotesigned
如需詳細資訊,請參閱 Set-ExecutionPolicy。
執行未經簽署的指令碼 (REMOTESIGNED 執行原則) 如果 Windows PowerShell 執行原則為
RemoteSigned,Windows PowerShell 就不會執行從網際網路下載且未經簽署的指令碼,包括透過
電子郵件與立即訊息程式接收的未經簽署指令碼。
若您嘗試執行下載的指令碼,Windows PowerShell 將顯示下列錯誤訊息:
<檔案名稱> 檔案無法載入。這個檔案
<檔案名稱> 未經數位簽署。這個指令碼
將不會在系統上執行。如需詳細資訊,請參閱 "Get-Help about_signing"。
執行指令碼之前,請先檢查其程式碼,確定您信任該指令碼。
指令碼的效力等同於任何的可執行程式。
執行未經簽署的指令碼:
1. 將指令檔儲存至電腦。
2. 按一下 [開始],再按一下 [我的電腦],然後找出剛才
儲存的指令檔。
3. 以滑鼠右鍵按一下指令檔,再按一下 [內容]。
4. 按一下 [解除封鎖]。
從網際網路下載的指令碼若已經過數位簽署,但您尚未選擇要信任其發行者,Windows
PowerShell 會顯示下列訊息:
要執行來自這個不受信任發行者的軟體嗎? <檔案名稱> 檔案是由 CN=<發行者名稱>
所發行。這個發行者在您的系統上並不受信任。只可執行來自受信任的發行者的指令
碼。
[V] 永不執行 [D] 不要執行 [R] 執行一次 [A] 永遠執行 [?] 說明 (預設為 "D"):
若您信任該發行者,請選取 [執行一次] 或 [永遠執行]。如果不信任發行者,則選取
[永不執行] 或 [不要執行]。一旦選取 [永不執行] 或 [永遠執行],Windows PowerShell
日後將不再提示您確認該發行者。
簽署指令碼的方法
--------------------------
您可以簽署自己撰寫的指令碼,以及從其他來源取得的指令碼。簽署任何指令碼之前,請
先檢查當中的每個命令,確認執行時安全無虞。
如需程式碼簽署的最佳作法,請參閱<程式碼簽署最佳作法>(英文),網址為
https://go.microsoft.com/fwlink/?LinkId=119096。
如需如何簽署指令檔的詳細資訊,請參閱 Set-AuthenticodeSignature。
若要為指令碼加上數位簽章,您必須使用程式碼簽署憑證簽署指令碼。適合用來簽署指令
檔的憑證有兩種:
-- 由憑證授權單位建立的憑證:
支付費用後,公眾憑證授權單位會先確認您的身分,再核發程式碼簽署憑證給您。若
向具有公信力的憑證授權單位購得憑證,您就能將指令碼分享給其他 Windows 電
腦的使用者,因為他們的電腦都信任該憑證授權單位。
-- 由您自己建立的憑證:
您可以建立自我簽署憑證,將您的電腦當成建立憑證的授權單位。
這種憑證不僅免費,還能讓您在自己的電腦上撰寫、簽署及執行指令碼。不過,自
我簽署憑證所簽署的指令碼並不會在其他電腦執行。
通常自我簽署憑證是用來簽署供自己使用而撰寫的指令碼,以及簽署從其他來源取得而且已
確認安全無虞的指令碼。這種憑證不適用於共用的指令碼,即使是在企業內部也不適合。
若要建立自我簽署憑證,請確定您的憑證已啟用加強私密金鑰保護。這可防止惡意程式以
您的名義簽署指令碼。如需相關指示,請參閱本主題最後一節。
建立自我簽署憑證
--------------------------------
若要建立自我簽署憑證,請使用憑證建立工具 (MakeCert.exe)。這套工具隨附於
Microsoft .NET Framework SDK (1.1 版與以後版本) 和 Microsoft Windows SDK。
如需 MakeCert.exe 工具之語法與參數說明的詳細資訊,請參閱 MSDN (Microsoft Developer
Network) 文件庫中的<憑證建立工具 (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 憑證提供者檢視憑證的相關資訊。
若已確實建立憑證,輸出結果將會顯示用於識別憑證的指紋,內容大致如下:
目錄: Microsoft.PowerShell.Security\Certificate::CurrentUser\My
Thumbprint Subject
---------- -------
4D4917CB140714BA5B81B96E0B18AAF2C4564FDF CN=PowerShell 使用者 ]
簽署指令碼
-------------
建立自我簽署憑證之後,您就可以簽署指令碼。如果執行原則設為 AllSigned,簽署指令碼
將允許您在自己的電腦上執行指令碼。
下列樣本指令碼 Add-Signature.ps1 會簽署指令碼。不過,若您使用 AllSigned 執行
原則,就必須先簽署 Add-Signature.ps1 指令碼才能執行它。
若要使用這個指令碼,請將下列文字複製到文字檔,並將檔案命名為
Add-Signature.ps1。
注意:請確定指令檔的副檔名不是 .txt。如果文字編輯器自行加上 ".txt",請將檔名置於引
號中:"add-signature.ps1"。
## add-signature.ps1
## 簽署檔案
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 將會顯示下
列錯誤訊息:
C:\remote_file.ps1 檔案無法載入。憑證的簽章無法驗證。
位於第 1 行,第 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 Local Certificate Root 所核發的憑證。
3. 按一下 [匯出],啟動 [憑證匯出精靈]。
4. 選取 [是,匯出私密金鑰],然後按 [下一步]。
5. 選取 [啟用加強保護]。
6. 輸入密碼,再輸入相同密碼進行確認。
7. 輸入檔名,並使用 .pfx 做為副檔名。
8. 按一下 [完成]。
重新匯入憑證:
1. 啟動 [憑證管理員]。
2. 按一下 [匯入],啟動 [憑證匯入精靈]。
3. 開啟執行匯出程序時建立的 .pfx 檔案所在位置。
4. 在 [密碼] 頁面上選取 [啟用加強私密金鑰保護],然後輸入匯出過程中指定的密碼。
5. 選取 [個人] 憑證存放區。
6. 按一下 [完成]。
避免簽章過期
-----------------------------------
指令碼中數位簽章的有效期限截至簽署憑證到期為止,或是只要時間戳記伺服器能夠確認指令碼是
在簽署憑證仍然有效時簽署,該數位簽章就有效力。
由於多數簽署憑證的有效期限只有一年,因此使用時間戳記伺服器能夠確保使用者在多年
以後仍然可以使用您的指令碼。
請參閱
about_Execution_Policies
about_Profiles
Get-ExecutionPolicy
Set-ExecutionPolicy
Set-AuthenticodeSignature
<程式碼簽署簡介>(https://go.microsoft.com/fwlink/?LinkId=106296) (英文)