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
相关产品推荐
相关产品推荐

