2013-12-18 5 views
0

Я подписываю сообщение, используя цифровой сертификат в веб-службе asp.net, используя приведенный ниже код. Подписание работает нормально, ожидается, что подписанная строкаMessage.ComputeSignature займет до 30-40 секунд, из-за этого я исключаю время ожидания таймаута. Тот же код, когда я запускаю приложение windows forms, производит результат во второй части. Любая подсказка или помощь.Подписание сообщения с использованием сертификата X509

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

ответ

3

Я не уверен, должен ли это быть ответ (я не знаю, какое влияние оно вызывает, но я узнаю). Просто установив свойство

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; 
    } 
+0

Я проверил его полностью X509IncludeOption.EndCertOnly это уменьшило длину подписи, означая, что в подпись включена только персональный сертификат. – adam

+0

В отличие от форумов, мы не используем «Спасибо», «Любая помощь оценена» или подписи на [so]. См. «[Должны ли« Привет »,« спасибо », теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be –

+0

@JohnSaunders ok рассмотрит это в следующий раз – adam

Смежные вопросы