.net 中的RSACryptoServiceProvider,NET 6

yiytaume  于 2023-05-02  发布在  .NET
关注(0)|答案(1)|浏览(187)

我正在开发一个。NET 6应用程序,它应该使用中的旧库。NET Framework.因为它太旧了,甚至不能在VS2022中打开,我做了升级。NET 6.
问题是有些东西似乎不工作,需要重写,因为不兼容之间。NET 6和.NET Framework。
1.案例一
其中之一似乎是RSACryptoServiceProvider或这整个部分

RSACryptoServiceProvider rsaCSP = (RSACryptoServiceProvider)this.cert.PrivateKey;
CspParameters cspParameters = new CspParameters();
cspParameters.KeyContainerName = rsaCSP.CspKeyContainerInfo.KeyContainerName;
cspParameters.KeyNumber = rsaCSP.CspKeyContainerInfo.KeyNumber == KeyNumber.Exchange ? 1 : 2;

RSACryptoServiceProvider rsaAesCSP = new RSACryptoServiceProvider(cspParameters);
byte[] signature = rsaAesCSP.SignData(bytes, CryptoConfig.MapNameToOID("SHA256"));

使用这个库时,我得到一个错误:
无法强制转换类型为“System”的对象。Security.Cryptography.RSACng' to type 'System.Security.Cryptography.RSACryptoServiceProvider
证书类别为X509Certificate2。
我如何替换这部分代码,使其与兼容。NET 6?
我试着这样做:

var rsa = this.cert.GetRSAPrivateKey();
            byte[] signature = rsa.SignData(bytes, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);

1.案例二

SignedXml xmlSig = new SignedXml(msg);

            byte[] pubKey = this.cert.GetPublicKey();
            string pubKeyBase64 = Convert.ToBase64String(pubKey);

            RSACryptoServiceProvider rsaCSP = (RSACryptoServiceProvider)this.cert.PrivateKey;
            CspParameters cspParams = new CspParameters();
            cspParams.KeyContainerName = rsaCSP.CspKeyContainerInfo.KeyContainerName;
            cspParams.KeyNumber = rsaCSP.CspKeyContainerInfo.KeyNumber == KeyNumber.Exchange ? 1 : 2;
            RSACryptoServiceProvider rsaAesCSP = new RSACryptoServiceProvider(cspParams);

            xmlSig.SigningKey = rsaAesCSP;

这里有一个类似问题。我也可以在这里替换为:

var rsa = this.cert.GetRSAPrivateKey();
xmlSig.SigningKey = rsa;

但我不确定这是正确的方法,因为通过这种方式“修复”这两个,我在另一个文件中得到了一个新的错误。你认为这是正确的吗?
P.S.只是你知道我在说什么。我正在使用和升级这个库:https://github.com/zvizdo/MadWare.Furs
通过更新上面列出的东西,接下来会发生什么:

System.Net.Http.HttpRequestException: An error occurred while sending the request.
       ---> System.IO.IOException: The decryption operation failed, see inner exception.
       ---> System.ComponentModel.Win32Exception (0x80090330): The specified data could not be decrypted.

更确切地说,这一行:

HttpResponseMessage resp = await client.PostAsync(url, cnt).ConfigureAwait(false);

在此文件中:https://github.com/zvizdo/MadWare.Furs/blob/master/src/MadWare.Furs/Http/SoapHttpService.cs
记住我也换了

WebRequestHandler handler = new WebRequestHandler();

var handler = new HttpClientHandler();

来编译这个。
编辑2:我已经将HttpClientHandler设置为TLS 1。2手动,现在我得到了一个不同的错误,说证书已过期。现在至少我知道到底什么是错的了。我会相应地更新后,当我得到一个有效的,并再试一次。

fwzugrvs

fwzugrvs1#

自.NET 4.7(和所有版本的。NET Core),则不能访问X509Certificate2对象上的PrivateKey属性。它已经过时了,在新的框架上会失败。以下是我写的关于这个主题的博客:相反,您必须使用适当的X509Certificate2扩展方法来访问私钥。每个公钥算法类型(RSA、DSA或ECDSA)都有一个扩展方法,然后访问相关属性以检索所需的信息。

相关问题