主题
    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 不会运行从 Internet 下载的未签名脚本,包括您通过电子邮
 件和即时消息传递程序接收到的未签名脚本。

    如果您试图运行下载的脚本,则 Windows PowerShell 将显示以下错误消息:

        无法加载文件 <file-name>。文件 
        <file-name> 未经数字签名。系统将
        不执行该脚本。有关详细信息,请参阅"Get-Help about_signing"。

    在运行该脚本前,请检查其代码以确保该脚本可信。
    脚本与任何可执行程序具有同样的效用。

    若要运行未签名脚本,请执行以下操作:

        1. 将脚本文件保存在计算机中。
	2. 依次单击"开始"和"我的电脑",然后找到保存的脚本文件。
	3. 右键单击该脚本文件,然后单击"属性"。
	4. 单击"取消阻止"。

    如果从 Internet 下载的脚本具有数字签名,而您尚未选择信任其发布者,则 Windows PowerShell 
    将显示以下消息:

        是否要运行来自此不可信发布者的软件?文件 <file-name> 由 CN=<publisher-name> 发布。
        此发布者在您的系统上不受信任。请只运行来自可信发布者的脚本。

        [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)
    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 将显示以下错误消息:

        无法加载文件 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)




目录