Несоответствие в результатах вызова Get-AuthenticodeSignature из PowerShell, часто говорит NotSigned - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть код файла 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 Ответ

0 голосов
/ 12 декабря 2018

К сожалению, Get-AuthenticodeSignature -Content распознает байтовые массивы только в том случае, если они представляют символы в кодировке "Unicode" (UTF-16LE) - любая другая кодировка искажается как NotSigned в выводе.
См. эта проблема GitHub .

Следствием ваших симптомов является то, что только сценарии CreateApplication.ps1 и UpdateParameters.ps1 имеют кодировку UTF-16LE.

Если вы хотите использовать -Content со всеми вашими скриптами:

  • либо : перекодируйте все ваши файлы скриптов в UTF-16LE (сохраните их с этой кодировкой).
  • или : передать выражение ([Text.Encoding]::Unicode.GetPreamble() +[Text.Encoding]::Unicode.GetBytes((Get-Content -Raw $_.FullName))) в -Content, т. е. вручную преобразовать содержимое файла в байты UTF-16LE;обратите внимание на необходимость явного предварительного указания спецификации (преамбула)).

Как вы заметили, используйте (подразумеваемый) параметр -FilePath - то есть передайте путь к файлу и разрешитеGet-AuthenticodeSignature сам читает его содержимое - это не , подпадающее под это ограничение кодирования - до тех пор, пока PowerShell может определять кодировку файла сценария по обычным правилам, проверка подписи завершается успешно.

...