RSACryptoServiceProvider, SignData и отступы в .NET / PowerShell Core - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь использовать метод SignData класса .NET RSACryptoServiceProvider из Powershell.

В Windows 10 / Powershell 5.1 / .NET 4.7 надежно работает следующий код:

$toSign = [System.Text.Encoding]::UTF8.GetBytes("ABCDE")

$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$cert.import("c:\ps\GAdmin\apiaccess.pfx","notasecret","Exportable,PersistKeySet")
$cert | fl *

$params = New-Object System.Security.Cryptography.CspParameters
$params.KeyContainerName = $cert.PrivateKey.CspKeyContainerInfo.KeyContainerName
$params.ProviderName = "Microsoft Enhanced RSA and AES Cryptographic Provider"
$params
$cert.PrivateKey.CspKeyContainerInfo.KeyNumber
$params.KeyNumber = 1
$rsa = New-Object System.Security.Cryptography.RSACryptoServiceProvider($params)
$tosign
$rsa.SignData($toSign,"SHA256")

Однако в Linux (или Windows) с .NET Core / Powershell Core у меня возникают проблемы. Я могу создать экземпляр RSACryptoServiceProvider, но из-за ошибки SignData:

$cert = Get-PfxCertificate ./apiaccess.pfx -Password (ConvertTo-SecureString "notasecret" -AsPlainText -Force)
$rsa = $cert.PrivateKey
$rsa.SignData($toSign,"SHA256")

Не удается найти перегрузку для "SignData" и счетчика аргументов: "2". В строке: 1 символ: 1 + $ rsa.SignData ($ toSign, "SHA256") + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: NotSpecified: (:) [], MethodException + FullyQualifiedErrorId: MethodCountCouldNotFindBest

Проверка определения метода - кажется, требуется параметр заполнения:

($rsa | get-member SignData).Definition

byte [] SignData (byte [] data, System.Security.Cryptography.HashAlgorithmName hashAlgorithm, System.Security.Cryptography.RSASignaturePadding padding), byte [] SignData (byte [] data, int offset, int count, System. Security.Cryptography.HashAlgorithmName hashAlgorithm, System.Security.Cryptography.RSASignaturePadding padding), byte [] SignData (данные System.IO.Stream, System.Security.Cryptography.HashAlgorithmName hashAlgorithm * системный тег

Итак, мой вопрос: как мне указать заполнение и вызвать SignData из Powershell Core?

1 Ответ

0 голосов
/ 04 мая 2018

Возможно, что $cert.PrivateKey вернул что-то отличное от RSACryptoServiceProvider. Вы действительно должны избегать вызова этого свойства и заменять его на $cert.GetRSAPrivateKey() (или любой другой алгоритм, который, как вы ожидаете, будет ключом ... он возвращает null, если вы ошиблись, поэтому исключения не являются проблемой). Не то чтобы это помогло, за исключением того, что гарантированно никогда не вернет RSACryptoServiceProvider в Linux (и «почти гарантированно» не вернет его в Windows). Хотя решит необходимость повторной интерпретации параметров CSP в Windows.

Вместо вызова `

$rsa.SignData($toSign, "SHA256")

вам следует позвонить

$rsa.SignData(
    $toSign,
    System.Security.Cryptography.HashAlgorithmNames.SHA256,
    System.Security.Cryptography.RSASignaturePadding.Pkcs1)

На самом деле я не знаю, что такое PowerShell для вторых двух параметров, надеюсь, мое понимание синтаксиса этого языка достаточно хорошее, чтобы разблокировать вас. И «SHA256», и «Pkcs1» здесь являются свойствами, так что вы можете сохранить их в локальном коде, если это сделает ваш код красивее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...