PowerShell脚本数字签名错误

hec6srdp  于 2023-03-02  发布在  Shell
关注(0)|答案(6)|浏览(374)

我在运行PowerShell脚本时遇到错误:
无法加载文件test_new.ps1。文件test_new.ps1未经过数字签名。
我创建了一个CA和一个证书,并使用here描述的过程对该文件进行了签名。
下面是我在MY目录上执行dir的情况:

EF76B3D7D8D2406E1F2EE60CC40644B122267F18  CN=PowerShell User

我可以看到附加在test_new.ps1文件末尾的签名块。
执行方针和范围如下:

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

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

2skhul33

2skhul331#

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

受限:不加载配置文件或运行脚本的默认设置。
所有签名:要求所有脚本和配置文件(包括您在本地计算机上编写的脚本)都由受信任的发布者签名。
远程签名:要求从Internet下载的所有脚本和配置文件都由受信任的远程发布者签名。
无限制:加载所有配置文件并运行所有脚本。如果运行从Internet下载的未签名脚本,则在运行脚本之前会提示您是否具有权限。
绕过:不阻止任何内容,也没有警告或提示。
未定义:从当前作用域中删除当前分配的执行策略,将会话返回到默认值。此参数不会删除在Active Directory组策略中设置的执行策略。

您可以通过以下命令设置PowerShell执行策略:
设置执行策略不受限制
如果要在域网络上运行脚本,则可能需要使用组策略来确保用于对脚本进行签名的代码签名证书是域中受信任的发行者。为此,需要执行两个步骤:
1.导出代码签名证书。
1.创建策略并将代码签名证书导入受信任的发布者。
在域网络中更新策略后,受信任的发布者证书应列在证书管理单元下的“受信任的发布者”中。

sqxo8psd

sqxo8psd2#

终于找到了解决这个问题的办法:

$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商店中发布才能工作。

puruo6ea

puruo6ea3#

这显然与PowerShell的策略有关,有了3个选项,它可以更改此错误的传递策略以及此错误的所有相同类型。
1设置-执行策略绕过-作用域当前用户-强制
2设置-执行策略远程签名-作用域当前用户-强制。(推荐)
3 Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Force. (不推荐,因为您的计算机环境在抵御恶意软件或任何有害软件方面会变得薄弱...)

00jrzges

00jrzges4#

    • 编辑**--添加了一些信息

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

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

在Windows 2003域和受限powershell上测试。

    • 第一次编辑**-由于评论认为这是不可能的,我显示了运行脚本的生产系统的屏幕截图:

启动powershell并启用旁路,然后执行脚本:

在未打开旁路的情况下启动powershell并执行脚本:

系统信息:

    • 第二次编辑**-由于评论@AnsgarWiechers。(因为我们谈论的是微软,通常有一种方法可以绕过强制实施的安全措施。)

引用评论:
... OP具有使用组策略(作用域MachinePolicy和/或UserPolicy)强制实施的执行策略。不能绕过...'
由位于注册表配置单元的组策略对象推送的ExecutionPolicy项:HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell.
当你将值从any更改为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设置为"bypass"):

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\系统32〉获取执行策略列表

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"
    • 第四次编辑**-结论

我想说得很清楚,所以我加上了结论,因为下面的评论可能会导致错误的假设。
这是参数'-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中的一个。
bwleehnv

bwleehnv5#

要修复此问题,您必须运行以下命令以运行Set-ExecutionPolicy并更改执行策略设置。

设置-执行策略-作用域进程-执行策略绕过

0ve6wy6x

0ve6wy6x6#

我尝试了所有的建议,但没有一个对我有效。这是我的解决方案,
1.选中获取执行策略列表
1.我的计算机策略是AllSigned -我需要更改此策略。
1.转到注册表编辑器:HKEY_L_M〉软件〉策略〉微软〉WINDOWS〉powershell:执行策略将数据更改为“绕过”。
1.运行ps1脚本以检查是否已修复。
我的机器在更新到Windows 11之前没有问题。我仍然不确定是什么原因导致了这个问题。

相关问题