【问题标题】:Message Signing using X509 certificate使用 X509 证书进行消息签名
【发布时间】: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();
        }

【问题讨论】:

    标签: c# x509 pkcs#7


    【解决方案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;
        }
    

    【讨论】:

    猜你喜欢
    • 2011-06-01
    • 2016-02-26
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    相关资源
    最近更新 更多