.NET Framework 4.8下C#用OpenSSL验证签名遇类型转换错误
解决.NET Framework 4.8中RSACng转RSACryptoServiceProvider的类型转换错误
问题原因
在.NET Framework 4.6及以上版本中,X509Certificate2.PublicKey.Key返回的RSA实现可能是RSACng(而非旧版的RSACryptoServiceProvider),直接强制类型转换会抛出类型不匹配的异常。此外你的验证代码还存在拼写错误:ceftificatePath应为certificatePath。
修复后的验证代码
将验证代码改为依赖RSA基类,而非具体的实现类,同时使用与签名代码一致的签名参数(SHA256哈希算法+Pkcs1填充):
var certificate = new X509Certificate2(certificatePath, "certificatePass", X509KeyStorageFlags.MachineKeySet); var dataToVerifyBytes = Encoding.UTF8.GetBytes(dataToVerify); var signatureBytes = Convert.FromBase64String(signature); using (var rsaAlg = certificate.GetRSAPublicKey()) { return rsaAlg.VerifyData( dataToVerifyBytes, signatureBytes, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1 ); }
关键改动说明
- 使用
GetRSAPublicKey()替代PublicKey.Key:这个方法直接返回RSA基类实例,自动适配当前环境的RSA实现(RSACng或RSACryptoServiceProvider),避免类型转换问题。 - 使用
VerifyData的重载版本:直接传入哈希算法名称和填充模式,和签名代码的SignData参数保持一致,逻辑更统一,也不需要手动创建SHA256Managed实例。 - 修正了路径变量的拼写错误:
ceftificatePath改为certificatePath,避免因变量名错误导致的文件找不到问题。
内容的提问来源于stack exchange,提问作者caglar.boran
相关产品推荐
相关产品推荐

