代码之家  ›  专栏  ›  技术社区  ›  abatishchev Karl Johan

从PowerShell调用get authenticodesignature的结果不一致,通常称为NotSigned

  •  4
  • abatishchev Karl Johan  · 技术社区  · 6 年前

    我在生成过程中签署了许多PowerShell文件代码。

    根据我打电话的方式,我得到了不同的签名状态 Get-AuthenticodeSignature :

    PS> Get-ChildItem | ForEach { Get-AuthenticodeSignature $_.Name }
    
    SignerCertificate                         Status  Path
    -----------------                         ------  ----
    E36170335E3DD78B6CDF1594B0D164F7C8A7B324  Valid   CleanUpdateParameters.ps1
    E36170335E3DD78B6CDF1594B0D164F7C8A7B324  Valid   CreateApplication.ps1
    E36170335E3DD78B6CDF1594B0D164F7C8A7B324  Valid   DeleteApplication.ps1
    E36170335E3DD78B6CDF1594B0D164F7C8A7B324  Valid   ProvisionApplicationType.ps1
    E36170335E3DD78B6CDF1594B0D164F7C8A7B324  Valid   UnprovisionApplicationType.ps1
    E36170335E3DD78B6CDF1594B0D164F7C8A7B324  Valid   UpdateParameters.ps1
    

    一切都很好。但下面是我尝试使用二进制内容验证文件时的结果:

    PS> Get-ChildItem | ForEach { Get-AuthenticodeSignature -Content ([System.IO.File]::ReadAllBytes($_.FullName)) -SourcePathOrExtension $_.Name }
    
    SignerCertificate                         Status     Path
    -----------------                         ------     ----
                                              NotSigned  CleanUpdateParameters.ps1
    E36170335E3DD78B6CDF1594B0D164F7C8A7B324  Valid      CreateApplication.ps1
                                              NotSigned  DeleteApplication.ps1
                                              NotSigned  ProvisionApplicationType.ps1
                                              NotSigned  UnprovisionApplicationType.ps1
    E36170335E3DD78B6CDF1594B0D164F7C8A7B324  Valid      UpdateParameters.ps1
    

    或字符串内容:

    PS> Get-ChildItem | ForEach { Get-AuthenticodeSignature -Content ([System.Text.Encoding]::ASCII.GetBytes([System.IO.File]::ReadAllText($_.FullName))) -SourcePathOrExtension $_.Name }
    
    SignerCertificate                         Status      Path
    -----------------                         ------      ----
                                              NotSigned   CleanUpdateParameters.ps1
    E36170335E3DD78B6CDF1594B0D164F7C8A7B324  Valid       CreateApplication.ps1
                                              NotSigned   DeleteApplication.ps1
                                              NotSigned   ProvisionApplicationType.ps1
                                              NotSigned   UnprovisionApplicationType.ps1
    E36170335E3DD78B6CDF1594B0D164F7C8A7B324  Valid       UpdateParameters.ps1
    

    我已经花了一个星期的时间来研究这个问题,但我不能完全理解是什么导致了这个矛盾/不一致。当我的应用程序(“客户机”)以字符串形式从服务(“服务器”)接收脚本并验证内容的有效性时,我必须使它工作。

    1 回复  |  直到 6 年前
        1
  •  1
  •   mklement0    6 年前

    悲哀地, Get-AuthenticodeSignature -Content 仅当字节数组表示“unicode”(utf-16le)编码字符时才识别它们 -任何其他编码都被歪曲为 NotSigned 在输出中。
    this GitHub issue .

    你症状的含义是只有脚本 CreateApplication.ps1 UpdateParameters.ps1 是UTF-16LE编码的。

    如果你想用 -Content 使用所有脚本:

    • 任何一个 :将所有脚本文件转换为UTF-16LE(使用该编码保存它们)。
    • :传递表达式 ([Text.Encoding]::Unicode.GetPreamble() +[Text.Encoding]::Unicode.GetBytes((Get-Content -Raw $_.FullName))) -内容 例如,手动将文件内容转换为utf-16le字节;注意需要显式地预先准备BOM(前导码))。

    正如您所观察到的,使用(隐含)参数 -FilePath -即通过 文件路径 Get-AuthenticodeSignature 本身阅读 目录 - IS 受此编码限制的约束-只要PowerShell可以根据常规规则推断脚本文件的编码,签名验证就会成功。

    推荐文章