PowerShell脚本数字签名错误

时间:2017-10-13 10:34:11

标签: powershell powershell-v2.0 powershell-v3.0 code-signing

运行PowerShell脚本时出现错误:

  

无法加载文件test_new.ps1。文件test_new.ps1未经过数字签名。

我创建了一个CA和一个证书,并使用here所述的过程对该文件进行了签名。

这是我在dir目录上执行MY的时候:

EF76B3D7D8D2406E1F2EE60CC40644B122267F18  CN=PowerShell User

我可以在test_new.ps1文件的末尾看到附加的签名块。

以下是执行政策和范围:

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       AllSigned
   UserPolicy       Undefined
      Process          Bypass
  CurrentUser       AllSigned
 LocalMachine       Undefined

机器策略应优先级设置为AllSigned。一切似乎都很好,为什么我仍然得到数字签名的错误。

4 个答案:

答案 0 :(得分:2)

终于找到了解决方案:

$cert=Get-ChildItem cert:\CurrentUser\MY
$store = New-Object 
$store = New-Object System.Security.Cryptography.X509Certificates.X509Store ("TrustedPublisher" , "LocalMachine")
$store.Open("ReadWrite")
$store.Add($cert)
$store.Close()

必须在TrustedPublisher商店发布才能发挥作用。

答案 1 :(得分:0)

Powershell执行策略设置为Allsigned仅运行由受信任发布者签名的脚本。您可以在下面找到-ExecutionPolicy参数的可能值:

受限制:默认设置,不加载配置文件或运行脚本。

AllSigned :要求所有脚本和配置文件都由受信任的发布者签名,包括您在本地计算机上编写的脚本。

RemoteSigned :要求从Internet下载的所有脚本和配置文件都由受信任的远程发布者签名。

Unrestricted :加载所有配置文件并运行所有脚本。如果您运行从Internet下载的未签名脚本,则会在运行之前提示您获得权限。

绕过:没有任何内容被屏蔽,也没有任何警告或提示。

未定义:从当前作用域中删除当前分配的执行策略,将会话恢复为默认值。此参数不会删除在Active Directory组策略中设置的执行策略。

您可以通过以下命令设置PowerShell执行策略:

  

Set-ExecutionPolicy不受限制

如果要在域网络上运行脚本,则可能使用组策略来确保用于签署脚本的代码签名证书是域中受信任的发布者。要做到这一点,有两个步骤:

  1. 导出代码签名证书。

  2. 创建策略并将代码签名证书导入受信任的发布者。

  3. 在您的域网络中更新策略后,“受信任的发布者”证书应列在“受信任的发布者”中。在证书管理单元下。

答案 2 :(得分:0)

修改 - 添加了一些信息

一种可能的方法完全绕过安全性并像这样启动你的脚本(为了绕过强制GPO,请参阅本文的底部):

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\path_to_file\test_new.ps1""'}"

在域和受限制的PowerShell上测试Windows 2003。

首次修改 - 由于评论不可能,我会在生产系统中显示已运行脚本的屏幕截图:

使用Bypass启动powershell并执行脚本: started powershell with Bypass

启动powershell而不绕过并执行脚本: started powershell without Bypass

系统信息: system information windows 2003

第二次编辑 - 由于评论@AnsgarWiechers。 (因为正是微软,我们所说的通常是一种绕过强制安全措施的方法。)

引用评论:

  

... OP具有使用GROUP POLICY强制执行的策略(范围   MachinePolicy和/或UserPolicy)。哪个不能被旁听......'

位于注册表配置单元中的组策略对象推送的ExecutionPolicy密钥:HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell

当您更改任何值时,请参阅Possible values for execution policies)到bypass的更多内容。然后你可以绕过强加的GPO。我确定还有其他方法可以做到这一点。有关更多创意,您可以查看好resource。我确信更有创意的人可以找到其他方法来解决GPO问题。

那说永久解决方案,你的重复使用会更好。据推测,它可以更安全地使用密钥,即使你也会依赖其他因素。

第三次修改 - 证明可以规避GPO政策(如果您有足够的权利这样做)

我终于找到了一些时间来探索各种可能性。对于Windows 2003,无法通过编辑组策略gpedit.msc来更改本地策略,必须在域级别上完成(MS不支持Windows 2003且当前为EOL

Windows 2008上,这是另一回事。

如果您更改本地政策,您可以轻松地将政策更改为AllSigned,如下所示:

PS C:\Windows\system32> Get-ExecutionPolicy -List

                                  Scope                         ExecutionPolicy
                                  -----                         ---------------
                          MachinePolicy                               AllSigned
                             UserPolicy                               AllSigned
                                Process                                  Bypass
                            CurrentUser                               Undefined
                           LocalMachine                               AllSigned

如果您通过上述参数执行脚本:-NoProfile -ExecutionPolicy Bypass您将收到以下消息,因此您的GPO策略要求脚本已签名:

File E:\t\powershell\get_local_admins_computer.ps1 cannot be loaded. The file E
:\t\powershell\get_local_admins_computer.ps1 is not digitally signed. The scrip
t will not execute on the system. Please see "get-help about_signing" for more
details..
    + CategoryInfo          : NotSpecified: (:) [], ParentContainsErrorRecordE
   xception
    + FullyQualifiedErrorId : RuntimeException

您还可以检查注册表设置以确保(还会显示运行脚本后要将值返回到的值):

C:\Windows\system32>REG QUERY HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Win
dows\PowerShell

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell
    EnableScripts    REG_DWORD    0x1
    ExecutionPolicy    REG_SZ    AllSigned

如果你拥有这样做的正确权利,这很容易被规避(这会将ExecutionPolicy设置为"绕过"):

   reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell" /f /v "ExecutionPolicy" /t REG_SZ /d "bypass"
    /v ... ValueName
    /t ... type
    /d ... data
    /f ... force (overwrites current value)

然后,如果你检查执行政策,你会发现确实存在变化:

  

PS C:\ Windows \ system32> Get-ExecutionPolicy -List

                              Scope                         ExecutionPolicy
                              -----                         ---------------
                      MachinePolicy                                  Bypass
                         UserPolicy                               AllSigned
                            Process                                  Bypass
                        CurrentUser                               Undefined
                       LocalMachine                               AllSigned

如果你然后运行脚本它将运行正常。

完成后,您可以通过以下方式返回之前的值:

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell" /f /v "ExecutionPolicy" /t REG_SZ /d "AllSigned"

Forth Edit - 结论

我想要清楚明白,所以我要加上结论,因为下面的评论会导致错误的假设。

这是参数'-NoProfile -ExecutionPolicy Bypass可以使用的最大安全性:

PS C:\> Get-ExecutionPolicy -List

                                                      Scope                                             ExecutionPolicy
                                                      -----                                             ---------------
                                              MachinePolicy                                                RemoteSigned
                                                 UserPolicy                                                   AllSigned
                                                    Process                                                   AllSigned
                                                CurrentUser                                                   AllSigned
                                               LocalMachine                                                   AllSigned

只有 的情况你需要一些解决方法或拥有一个签名密钥的时候 MachinePolicy设置为AllSigned。最佳解决方案是使用密钥。如果由于某种原因您无法使用上述步骤更改注册表中的值或尝试上面已链接的15 ways to bypass the powershell execution policy之一。

答案 3 :(得分:0)

它显然与PowerShell的策略有关,具有3个选项,它可以更改此错误和所有相同类型的错误的传递策略。

1个Set-ExecutionPolicy绕过-Scope CurrentUser -Force

2 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force。(推荐)

3 Set-ExecutionPolicy Unrestricted-作用域CurrentUser-强制。 (不建议使用,因为您的计算机环境对恶意软件或任何有害软件的攻击能力很弱...)