PowerShell签名和执行策略

主题
    签名和执行策略

简短说明
    描述 Windows PowerShell 执行策略,以及如何使用和更改它们。

详细说明

    PowerShell 执行策略通过确定 PowerShell 加载配置文件和运行脚本的条件,为脚本环境提供安全性。

    默认设置为最安全的策略“Restricted”。该设置允许运行单个命令,但不允许运行脚本。

    如果执行策略不允许 PowerShell 加载文件或运行脚本,则将显示警告以解释该 限制的原因。

        “加载扩展类型数据文件时出错:”
 “加载格式数据文件时出错:”

    若要加载文件或运行脚本,请更改执行策略。

更改执行策略
------------------------------
您可以更改计算机上的 PowerShell 执行策略。该更改将立即生效,且一直保持到再次更改时。只有管理员才可更改该策略。

    若要更改执行策略,请键入:

  1. Set-ExecutionPolicy <策略名称> 

    例如,

  1. Set-ExecutionPolicy RemoteSigned 

如果该命令执行成功,则 PowerShell 将显示命令提示符。没有表示执行成功的消息。如果该命令失败,则 PowerShell 将显示一条错误消息,并还原到先前的执行策略。

    若要查看 PowerShell 执行策略,请键入:

  1. Get-ExecutionPolicy 

如果该命令执行失败,则可能是由于拼错了策略名称。请检查该名称,然后重试。如果您无权运行此命令,请与系统管理员联系。

POWERSHELL 执行策略
------------------------------

PowerShell 执行策略包括:

Restricted
        - 默认的执行策略。
        - 允许单个命令运行,但无法运行脚本。

    AllSigned
        - 可以运行脚本。
        - 要求可信发布者对所有脚本和配置文件(包括本地计算机上编写的脚本)的
   数字签名。
 - 在运行来自可信发布者的脚本之前对您进行提示。
        - 运行已签名但有恶意的脚本带来的风险。

RemoteSigned
        - 可以运行脚本。
        - 要求可信发布者对从 Internet(包括电子邮件和即时消息程序)下载的脚本和配置文件的数字签名。
 - 无需从本地计算机上运行的脚本的数字签名。
 - 在运行来自可信发布者的脚本之前不向您提示。
        - 运行已签名但有恶意的脚本带来的风险。

    Unrestricted
        - 可以运行未签名脚本。
        - 在警告您文件来源于 Internet 后,运行从 Internet(包括 Microsoft Outlook、Outlook Express 和 Windows Messenger)下载的脚本和配置文件。
        - 运行恶意脚本带来的风险。

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

如果 PowerShell 执行策略为 RemoteSigned,则 PowerShell 将不会运行从Internet(包括电子邮件和即时消息程序)下载的未签名脚本。

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

    无法加载文件 C:\remote.ps1。文件 C:\remote.ps1 未经数字签名。无法在系
    统中执行该脚本。有关详细信息,请参阅“Get-Help about_signing”。

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

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

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

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

是否要运行来自此不可信发布者的软件? 文件 C:\remote_file.ps1 是由 CN=<发布者名称> 发布的。此发布者在您的系统上不受信任。请只运行来自可信发布者的脚本。

    [V] 从不运行  [D] 不运行  [R] 运行一次  [A] 始终运行
    [?] 帮助(默认选择是“D”):

    如果您信任发布者,请选择“运行一次”或“始终运行”。如果您不信任发布者,则请选择“从不运行”或“不运行”。如果选择“从不运行”或“始终运行”,则 PowerShell 将不再针对此发布者提醒您。

对脚本进行签名的方法
------------------------------------------

可以对编写的脚本以及来自其他源的脚本进行签名。在对任何脚本进行签名前,请检查每条命令并验证运行此脚本是安全的。

    有关如何在 PowerShell 命令行中对脚本文件进行签名的详细信息,请键入:

  1. Get-Help Set-AuthenticodeSignature 

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

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

       公共证书颁发机构可验证您的身份并向您颁发代码签名证书,但要收取费用。
       在从可信的证书颁发机构购买证书之后,您将可以与运行 Windows 的其他计
       算机上的用户共享该脚本,因为其他计算机信任该证书颁发机构。

    -- 您创建的证书:

       您可以创建“自签名证书”,而您的计算机就是创建该证书的颁发机构。这类证
       书是免费的,它允许您在您的计算机上编写、签名和运行脚本,但是其他计算
       机不信任您的计算机,可能不会运行该脚本。

       如果您创建了自签名证书,请确保为您的证书启用强私钥保护。从而防止恶意
       程序以您的名义对脚本进行签名。本主题的最后部分将提供这些说明。

创建自签名证书
-------------------------------------------------------------
若要创建自签名证书,请使用 MakeCert.exe(一种工具,包含在 Microsoft .NETFramework SDK(1.1 及更高版本)和 Microsoft Platform SDK 中)。

若要使用 MakeCert 来创建证书,请执行以下操作:

    在 SDK 命令提示符窗口中,运行以下命令:

    第一条命令将为计算机创建本地证书颁发机构。第二条命令从该证书颁发机构生
    成个人证书:

  1. makecert -n "CN=PowerShell Local Certificate Root" -a sha1 `  
  2.     -eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer `  
  3.     -ss Root -sr localMachine  
  4.  
  5. makecert -pe -n "CN=PowerShell User" -ss MY -a sha1 `  
  6.     -eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer  

    MakeCert 将提示您输入私钥密码。

若要验证生成的证书是否正确,请执行以下操作:

    在 PowerShell 提示符下键入:

  1. get-childitem cert:\CurrentUser\My -codesigning 

    此命令使用 PowerShell 证书提供程序来查看该证书的相关信息。

    如果该证书已创建完成,则输出将显示该证书的指纹,其中包含 PowerShell 用户的身份验证数据,如下所示:

目录: Microsoft.PowerShell.Security\Certificate::CurrentUser\My

        指纹                                      使用者
        ----------                                -------
        4D4917CB140714BA5B81B96E0B18AAF2C4564FDF  CN=PowerShell User ]

对脚本进行签名
-------------

如果您具有自签名证书,则可对脚本进行签名。如果使用 AllSigned 执行策略,则对脚本进行签名允许您在您的计算机上运行该脚本。

以下示例脚本 sign-file.ps1 可对脚本进行签名。但如果使用 AllSigned 执行策略,则必须在运行 sign-file.ps1 之前对其进行签名。

若要使用此脚本,请将以下文本复制到文本文件中并将该文本文件命名为
sign-file.ps1。

(请确保该脚本文件没有 .txt 文件扩展名。如果文本编辑器向其追加 .txt,则请将
文件名括在引号中,例如“sign-file.ps1”。)

  1. ## sign-file.ps1   
  2. ## 对文件进行签名  
  3. param([string] $file=$(throw "请指定文件名。"))   
  4. $cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]  
  5. Set-AuthenticodeSignature $file $cert 

若要对 sign-file.ps1 进行签名,请在 PowerShell 命令提示符下键入以下命令:

  1. $cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]  
  2.  
  3. Set-AuthenticodeSignature sign-file.ps1 $cert  

在对脚本进行签名之后,即可在本地计算机上运行该脚本。但是,如果计算机上的PowerShell 执行策略要求来自可信证书颁发机构的数字签名,则此脚本将无法在该计算机上运行。如果您试图这样做,则 PowerShell 将报告以下错误:

    无法加载文件 C:\remote_file.ps1。无法验证该证书的签名。
 所在行:1 字符:15
        + .\ remote_file.ps1 <<<<    无法加载文件 C:\remote_file.ps1。无法验证该证书的签名。
 所在行:1 字符:15
        + .\ remote_file.ps1 <<<<

如果在运行非您编写的脚本时 PowerShell 显示此消息,请按照处理任何未签名脚本的方式来处理该文件。检查代码,如果代码可信,则对其进行签名并运行。

为证书启用强私钥保护
---------------------------------------------------------

如果您的计算机上具有私人证书,则恶意程序可能会以您的名义对脚本进行签名,从而导致授权 PowerShell 运行这些脚本。

若要防止以您的名义进行的自动签名,请使用证书管理器工具 (Certmgr.exe) 将您的签名证书导出到 .pfx 文件中。证书管理器包含在Microsoft .NET Framework SDK、Microsoft Platform SDK,以及 Internet Explorer 5.0 及更高版本中。

若要导出证书,请执行以下操作:

    1. 启动证书管理器( GUI 工具)。

    2. 选择由“PowerShell Local Certificate Root”颁发的证书。

    3. 单击“导出”以启动证书导出向导。

    4. 选中“是,导出私钥”,然后单击“下一步”。

    5. 选中“启用加强保护”。

    6. 键入密码,然后再次键入密码进行确认。

    7. 键入文件扩展名为 .pfx 的文件名。

    8. 单击“完成”。

若要重新导入证书,请执行以下操作:

    1. 启动证书管理器( GUI 工具)。

    2. 单击“导入”以启动证书导入向导。

    3. 浏览到您在导出过程中创建 .pfx 文件的位置。

    4. 在“密码”页上选中“启用强私钥保护”,然后输入导出过程中所指定的密码。

    5. 选择“个人”证书存储。

    6. 单击“完成”。

另请参阅

    有关代码签名的信息,请在 http://msdn.microsoft.com/ 的 Microsoft Developer Network (MSDN) 参考资料中搜索“Introduction to Code Signing” (代码签名简介)。

    有关 Set-AuthenticodeSignature 命令的信息,请在 PowerShell 命令提示符下输入以下命令:

  1. help Set-AuthenticodeSignature 
伪python爱好者,正宗测试实践者。
原文地址:https://www.cnblogs.com/herbert/p/1756923.html