【发布时间】:2018-05-04 05:28:54
【问题描述】:
我正在尝试使用 Powershell 中的 .NET RSACryptoServiceProvider 类的 SignData 方法。
在 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")
但是,在带有 .NET Core/Powershell Core 的 Linux(或 Windows)上,我遇到了问题。我可以实例化一个 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 data, System.Security.Cryptography.HashAlgorithmName hashAlgorithm, System.Security.Cryptography.RSASignaturePadding padding)
所以我的问题是:如何指定填充并从 Powershell Core 调用 SignData?
【问题讨论】:
-
我曾认为 Linux (github.com/dotnet/corefx/issues/17410) 上的 RSACryptoServiceProvider 提供程序存在问题。关于 Windows Core 的问题,请查看此帖子 stackoverflow.com/questions/41986995/implement-rsa-in-net-core/…。这两个答案都来自微软的 Jeremy Barton。堆栈上的问题应该可以满足您的需求。
-
@Adam - 你是对的,这个问题并不特定于这个提供商。行为发生了变化,并且也影响了 RSACng 和 OpenSSL 提供程序;我应该更准确。
标签: .net powershell cryptography