about_Signing

应用到: Windows PowerShell 2.0, Windows PowerShell 3.0

主题

about_Signing

简短说明

说明如何对脚本进行签名,以便它们遵循 Windows PowerShell® 执行策略。

详细说明

受限执行策略不允许运行任何脚本。AllSigned 和 RemoteSigned 执行策略将阻止 Windows PowerShell 运行不具有数字签名的脚本。

本主题说明如何运行未经签名的选定脚本(即使执行策略是 RemoteSigned 也是如此),以及如何对自用脚本进行签名。

有关 Windows PowerShell 执行策略的详细信息,请参阅 about_Execution_Policy。

允许运行已签名的脚本

当你首次在计算机上启动 Windows PowerShell 时,受限执行策略(默认)很可能会生效。

受限策略不允许运行任何脚本。

若要在计算机上查找有效执行策略,请键入:

        Get-ExecutionPolicy

若要运行你写入到本地计算机的未经签名的脚本和来自其他用户的已签名脚本,请使用以管理员身份运行选项启动 Windows PowerShell,然后使用以下命令将计算机上的执行策略更改为 RemoteSigned:

        Set-ExecutionPolicy RemoteSigned

有关详细信息,请参阅 Set-ExecutionPolicy cmdlet 的帮助主题。

运行未经签名的脚本(REMOTESIGNED 执行策略)

如果你的 Windows PowerShell 执行策略是 RemoteSigned,Windows PowerShell 将不会运行从 Internet 下载的未经签名的脚本,包括通过电子邮件和即时消息程序接收的未经签名的脚本。

如果你尝试运行已下载的脚本,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. 单击"取消阻止"。

如果从 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 PowerShell 3.0 的 PKI 模块中引入的 New-SelfSignedCertificate cmdlet 可创建一个适用于测试的自签名证书。有关详细信息,请参阅 New-SelfSignedCertificate cmdlet 的帮助主题。

若要向脚本添加数字签名,必须使用代码签名证书对其进行签名。以下两种类型的证书均适用于对脚本文件进行签名:

  • -- 证书颁发机构创建的证书:

    支付费用后,公共证书颁发机构即可验证你的身份并为你提供一个代码签名证书。在你从声誉良好的证书颁发机构购买证书后,你便可以与运行 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) 库中的"证书创建工具 (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)