Я пытаюсь использовать метод 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?