首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RSACryptoServiceProvider in .NET 6

RSACryptoServiceProvider in .NET 6
EN

Stack Overflow用户
提问于 2022-06-02 09:24:19
回答 1查看 760关注 0票数 1

我正在开发一个.NET 6应用程序,它应该在.NET框架中使用一个旧库。因为它太老了,甚至在VS2022中都无法打开,所以我对.NET 6进行了升级。

问题是,由于.NET 6和.NET框架之间的不兼容性,有些东西似乎不起作用,需要重写。

  1. 案例一

其中之一似乎是RSACryptoServiceProvider或整个部分

代码语言:javascript
复制
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”类型的对象强制转换为System.Security.Cryptography.RSACng类型

证书类是X509Certificate2。

如何替换代码的这一部分,使其与.NET 6兼容?

我试过用这个:

代码语言:javascript
复制
            var rsa = this.cert.GetRSAPrivateKey();
            byte[] signature = rsa.SignData(bytes, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
  1. 案例2
代码语言:javascript
复制
            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;

这是一个类似的问题。我也可以在这里用以下文字代替:

代码语言:javascript
复制
var rsa = this.cert.GetRSAPrivateKey();
xmlSig.SigningKey = rsa;

但我不确定这是不是正确的方法,因为通过这样“修复”这两种方法,我在另一个文件中得到了一个新的错误。你认为这样做对吗?

只是你知道我在说什么。我正在使用和升级这个库:https://github.com/zvizdo/MadWare.Furs

通过更新上面列出的内容,接下来的问题是:

代码语言:javascript
复制
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.

更确切地说,这一行:

代码语言:javascript
复制
                HttpResponseMessage resp = await client.PostAsync(url, cnt).ConfigureAwait(false);

在这个文件中:https://github.com/zvizdo/MadWare.Furs/blob/master/src/MadWare.Furs/Http/SoapHttpService.cs

记住,我也代替了

代码语言:javascript
复制
WebRequestHandler handler = new WebRequestHandler();

使用

代码语言:javascript
复制
var handler = new HttpClientHandler();

来进行这个编译。

编辑2:我已经手动将HttpClientHandler设置为TLS1.2,现在我得到了一个不同的错误,即证书过期了。现在至少我知道到底出了什么问题。当我得到一个有效的帖子后,我会相应地更新这个帖子,然后再试一次。

EN

回答 1

Stack Overflow用户

发布于 2022-06-02 09:48:16

由于.NET 4.7 (以及.NET核心的所有版本),您不能访问X509Certificate2对象上的PrivateKey属性。它已经过时,在较新的框架上将失败。这是我写的关于这个主题的博客文章:https://www.pkisolutions.com/accessing-and-using-certificate-private-keys-in-net-framework-net-core/。相反,您必须使用和适当的X509Certificate2延拓法来访问私钥。对于每种公钥算法类型(RSA、DSA或ECDSA)都有一种扩展方法,然后访问相关属性以检索所需信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72473835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档