You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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
    );
}

关键改动说明

  1. 使用GetRSAPublicKey()替代PublicKey.Key:这个方法直接返回RSA基类实例,自动适配当前环境的RSA实现(RSACng或RSACryptoServiceProvider),避免类型转换问题。
  2. 使用VerifyData的重载版本:直接传入哈希算法名称和填充模式,和签名代码的SignData参数保持一致,逻辑更统一,也不需要手动创建SHA256Managed实例。
  3. 修正了路径变量的拼写错误:ceftificatePath改为certificatePath,避免因变量名错误导致的文件找不到问题。

内容的提问来源于stack exchange,提问作者caglar.boran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 07:25:23