我正在开发一个.NET 6应用程序,它应该在.NET框架中使用一个旧库。因为它太老了,甚至在VS2022中都无法打开,所以我对.NET 6进行了升级。
问题是,由于.NET 6和.NET框架之间的不兼容性,有些东西似乎不起作用,需要重写。
其中之一似乎是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”类型的对象强制转换为System.Security.Cryptography.RSACng类型
证书类是X509Certificate2。
如何替换代码的这一部分,使其与.NET 6兼容?
我试过用这个:
var rsa = this.cert.GetRSAPrivateKey();
byte[] signature = rsa.SignData(bytes, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); 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;但我不确定这是不是正确的方法,因为通过这样“修复”这两种方法,我在另一个文件中得到了一个新的错误。你认为这样做对吗?
只是你知道我在说什么。我正在使用和升级这个库: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设置为TLS1.2,现在我得到了一个不同的错误,即证书过期了。现在至少我知道到底出了什么问题。当我得到一个有效的帖子后,我会相应地更新这个帖子,然后再试一次。
发布于 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)都有一种扩展方法,然后访问相关属性以检索所需信息。
https://stackoverflow.com/questions/72473835
复制相似问题