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

SHA1withRSA证书签名在.NET Framework与.NET Core计算结果不一致

问题原因

.NET Framework和.NET Core对SignedCms组件的默认签名属性配置存在差异,直接导致最终生成的CMS签名结果不一致:

  • .NET Framework 4.6.1环境下的CmsSigner默认仅会自动添加Pkcs9ContentType作为已签名属性
  • .NET Core 3.1环境下的CmsSigner默认会额外自动添加签名时间、主题密钥标识符两个已签名属性

已签名属性属于CMS签名结构的一部分,属性内容不同,最终编码输出的签名结果自然存在差异,不过两个结果都是合法的SHA1withRSA CMS签名,仅携带的元数据不同。

解决方案

显式控制CmsSigner的已签名属性集合,和.NET Framework的默认行为对齐即可,修改后的代码如下:

public static string SignatureMessage(string certFileName, string password, byte[] dataTobeSign)
{
    byte[] pfxCert = File.ReadAllBytes(certFileName);
    SecureString pwd = new SecureString();
    char[] pwdCharArray = password.ToCharArray();

    for (int i = 0; i < pwdCharArray.Length; i++)
    {
        pwd.AppendChar(pwdCharArray[i]);
    }

    X509Certificate2 cert = new X509Certificate2(pfxCert, pwd);

    CmsSigner signer = new CmsSigner(cert);
    signer.DigestAlgorithm = new Oid("1.3.14.3.2.26", "sha1");
    signer.IncludeOption = X509IncludeOption.EndCertOnly;

    // 新增部分:清空默认自动添加的额外属性,手动和.NET Framework默认行为对齐
    signer.SignedAttributes.Clear();
    signer.SignedAttributes.Add(new Pkcs9ContentType());

    ContentInfo signedData = new ContentInfo(dataTobeSign);
    SignedCms cms = new SignedCms(signedData, true);
    cms.ComputeSignature(signer);
    byte[] signature = cms.Encode();
    return Convert.ToBase64String(signature);
}

修改后两个环境生成的签名结果就会完全一致。

内容的提问来源于stack exchange,提问作者kang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:45:03