2015-04-09 2 views
0

я получаю ошибку нуля-значный по этому сценарию:PublicKey.Key.Encrypt ошибки Вы не можете вызвать метод выражения нуля-значной

$key = $cert.PrivateKey.Decrypt($object.Key, $true) 

Это взято из примеров Powershell, так что я понятия не имею, почему он не работает. Любая подсказка? Сертификат найден правильно, используя его печать большого пальца, и секретный ключ находится в нем.

Это работает на Windows, 2012 R2 с Powershell v4

try 
{ 
    $object = Import-Clixml -Path c:\temp\encryptionTest.xml 

    $thumbprint = '58E3080C84336ECFBBF9EFFCFF98788880F0BA5F' 

    $cert = Get-Item -Path Cert:\LocalMachine\My\$thumbprint -ErrorAction Stop 

    $key = $cert.PrivateKey.Decrypt($object.Key, $true) 
    $cert.PrivateKey 
    $secureString = $object.Payload | ConvertTo-SecureString -Key $key 
    $secureString 
} 
finally 
{ 
    if ($null -ne $key) { [array]::Clear($key, 0, $key.Length) } 
} 

UPDATE: Я связался с автором сценария и он, что упоминался проблема заключается в том, что .NET не дружит из коробки с CNG (Crypto Следующее поколение), которые идентифицируются как версия 3 (именно та версия, которую мы используем). Он предоставил новую функцию, которая работает с ними.

+0

Я должен добавить, что файл c: \ temp \ encryptionTest.xml содержит текст, который я пытаюсь расшифровать, и этот файл был ранее создан с использованием шифрованной версии скрипта и что он работает правильно – Kinwolf

+0

Вы получаете что-то, если вы просто печатаете/запускаете '$ cert.PrivateKey' в этот момент в скрипте? –

+0

Хмм, действительно, $ cert.PrivateKey не отображается $ cert содержит сертификат сам по себе. Зачем это было? – Kinwolf

ответ

0

Я связался с автором сценария, и он отметил, что проблема заключается в том, что .NET не играет превосходно из коробки с сертификатами CNG (Crypto Next Generation), которые идентифицируются как версия 3 (именно такая версия мы используем) Он поставил новую функцию, которая работает с ними.

https://github.com/dlwyatt/ProtectedData

1

Я была такая же проблема, но вместо того, подбирая серт от Cert: \ LocalMachine \ My, я изменил его на

$cert = Get-Item -Path Cert:\CurrentUser\My\$thumbprint -ErrorAction Stop 

и она отлично работает.

Смежные вопросы