使用 X509 证书进行消息签名

Posted

技术标签:

【中文标题】使用 X509 证书进行消息签名【英文标题】:Message Signing using X509 certificate 【发布时间】:2014-01-06 16:44:35 【问题描述】:

我正在使用以下代码在 asp.net 网络服务中使用数字证书签署消息。 签名工作正常,预计 signedMessage.ComputeSignature 行最多需要 30 到 40 秒,因为我面临超时异常。当我在 Windows 窗体应用程序下运行时,相同的代码会在几分之一秒内产生结果。任何线索或帮助。

   public static string Encrypt(string fullMessage, string certificateName, bool deAttch)
    
        X509Certificate2 signer = GetCertificate(certificateName);  
        byte[] contentBytes = Encoding.ASCII.GetBytes(fullMessage);  
        Oid contentOid = new Oid("1.2.840.113549.1.7.1", "PKCS 7 Data");
        SignedCms signedMessage = new SignedCms(new ContentInfo(contentOid, contentBytes), deAttch);

        signedMessage.ComputeSignature(new CmsSigner(signer));

        byte[] signedBytes = signedMessage.Encode();
        return Convert.ToBase64String(signedBytes).Trim();
        

【问题讨论】:

【参考方案1】:

我不确定这是否应该是一个答案(我不知道它会造成什么影响,但我会找出答案)。只是设置一个属性

cert.IncludeOption = X509IncludeOption.EndCertOnly;    

CmsSigner cert = new CmsSigner(signer);

以前我使用构造函数创建对象并直接传递给方法。现在它工作正常,不需要花费太多时间。

   public static string Encrypt(string fullMessage, string certificateName, bool deAttch)
    
        X509Certificate2 signer = GetCertificate(certificateName);  
        byte[] contentBytes = Encoding.ASCII.GetBytes(fullMessage);  
        Oid contentOid = new Oid("1.2.840.113549.1.7.1", "PKCS 7 Data");
        SignedCms signedMessage = new SignedCms(new ContentInfo(contentOid, contentBytes), deAttch);
        CmsSigner cert = new CmsSigner(signer);
        cert.IncludeOption = X509IncludeOption.EndCertOnly;            
        signedMessage.ComputeSignature(cert);
        byte[] signedBytes = signedMessage.Encode();
        return Convert.ToBase64String(signedBytes).Trim();
        


        private static X509Certificate2 GetCertificate(string certificateName)
    
        X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
        store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
        X509Certificate2 certificate = store.Certificates.Cast<X509Certificate2>().Where(cert => cert.Subject.IndexOf(certificateName) >= 0).FirstOrDefault();
        if (certificate == null)
            throw new Exception("Certificate " + certificateName + " not found.");

        return certificate;
    

【讨论】:

我彻底检查了 X509IncludeOption.EndCertOnly 它减少了签名的长度,这意味着签名中只包含个人证书。 与论坛网站不同,我们不使用“谢谢”、“感谢任何帮助”或Stack Overflow 上的签名。请参阅“Should 'Hi', 'thanks,' taglines, and salutations be removed from posts?. @JohnSaunders ok 下次会考虑这个 它也对我有用,你可以标记这个答案! :)

以上是关于使用 X509 证书进行消息签名的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个自签名的SSL证书(X509)

如何验证 x509 证书的签名?

iOS适配HTTPS,创建一个自签名的SSL证书(x509)具体步骤

是否可以创建没有签名字段的 x509 证书? [复制]

CA签名X509证书包含X509v3扩展名“主题备用名称”两次

在 Hyperledger Fabric 中使用的外部 x509 证书签名和密钥算法的要求