Статус: Активный участник
  Группы: Участники
 Зарегистрирован: 17.09.2010(UTC) Сообщений: 73  Откуда: АО ИНФИНИТУМ, Москва Сказал «Спасибо»: 3 раз
  
	 
	
     | 
    
        
            
		      
                Доброго времени суток.
  Необходимо подписать файл несколькими подписями в формате PKCS#7/CMS и хранить их все в ОДНОМ detached файле .sig. В примере показано как добавить подпись, но при этом подписывается файл .sig. Возможно ли подписать второй подписью сам исходный файл, но сохранить её в существующем файле подписи? 
            
	  
         
     | 
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
            
        
            
            
    
        
	Статус: Сотрудник
  Группы: Администраторы
 Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,417  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 729 раз в 630 постах
  
	 
	
     | 
    
        
            
		      
                Может так? Метод класс SignedCms Если подпись уже была, то добавится вторая (cosign).  Цитата:public void ComputeSignature(CmsSigner signer, bool silent) {     if (signer == null)     {         throw new ArgumentNullException("signer");     }     if (this.ContentInfo.Content.Length == 0)     {         throw new CryptographicException(SecurityResources.GetResourceString("Cryptography_Cms_Sign_Empty_Content"));     }     if (SubjectIdentifierType.NoSignature == signer.SignerIdentifierType)     {         if ((this.m_safeCryptMsgHandle != null) && !this.m_safeCryptMsgHandle.IsInvalid)         {             throw new CryptographicException(SecurityResources.GetResourceString("Cryptography_Cms_Sign_No_Signature_First_Signer"));         }         this.Sign(signer, silent);     }     else     {         if (signer.Certificate == null)         {             if (silent)             {                 throw new InvalidOperationException(SecurityResources.GetResourceString("Cryptography_Cms_RecipientCertificateNotFound"));             }             signer.Certificate = PkcsUtils.SelectSignerCertificate();         }         if (!signer.Certificate.HasPrivateKey)         {             throw new CryptographicException(-2146893811);         }         CspParameters parameters = new CspParameters();         if (!X509Utils.GetPrivateKeyInfo(X509Utils.GetCertContext(signer.Certificate), ref parameters))         {             throw new CryptographicException(Marshal.GetLastWin32Error());         }         KeyContainerPermission permission = new KeyContainerPermission(KeyContainerPermissionFlags.NoFlags);         KeyContainerPermissionAccessEntry accessEntry = new KeyContainerPermissionAccessEntry(parameters, KeyContainerPermissionFlags.Sign | KeyContainerPermissionFlags.Open);         permission.AccessEntries.Add(accessEntry);         permission.Demand();         if ((this.m_safeCryptMsgHandle == null) || this.m_safeCryptMsgHandle.IsInvalid)         {             this.Sign(signer, silent);         }         else         {             this.CoSign(signer, silent);         }     } }
        | 
 | 
            
	 
        
    
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
    
        
            
            
    
        
	Статус: Активный участник
  Группы: Участники
 Зарегистрирован: 17.09.2010(UTC) Сообщений: 73  Откуда: АО ИНФИНИТУМ, Москва Сказал «Спасибо»: 3 раз
  
	 
	
     | 
    
        
            
		      
                maxdm, спасибо, что ответили. Я наверное нечетко сформулировал вопрос, извините    Мой код, основанный на темплэйтах КриптоПро: Цитата:static void AddSignature(string sigFile, string certThumb)         {             var signerCert = GetCertificate(certThumb);
              // Подписываем файл с предыдущей подписью и ...             var encodedSignature = SignCMS(sigFile, signerCert, true);             // ... затираем его             File.WriteAllBytes(sigFile, encodedSignature);         }
          // Подписываем сообщение секретным ключем.         static byte[] SignCMS(string file2Sig, X509Certificate2 signerCert, bool isMsgSignature)         {             var msg = File.ReadAllBytes(file2Sig);
              var contentInfo = new ContentInfo(msg);             var signedCms = new SignedCms(contentInfo, true);
              if (isMsgSignature)                 signedCms.Decode(msg);
              var cmsSigner = new CmsSigner(signerCert)                                 {                                     IncludeOption = X509IncludeOption.WholeChain                                 };
              signedCms.ComputeSignature(cmsSigner);
              return signedCms.Encode();         }  Как видно из кода, каждая накладываемая подпись, начиная со второй, накладывается на отдельный файл (detached), содержащий инфо обо всех предыдущих подписях. В этом случае при проверке подписей все, кроме первой, считаются недействительными.  Есть подозрения, что это происходит из-за того, что эти подписи наложены не на сам файл-источник, а на отделенный файл .sig. Других примеров добавления detached подписи я не на нашел. Проверяю КриптоАРМом. Вот и возник вопрос, можно ли подписывать каждый раз файл-источник, а инфо о подписи складывать в .sig файл, где уже лежит инфо о предыдущих подписях? Если возможно, то как? Есть догадки, что КриптоАРМ именно так и делает...  
            
	  
         
     | 
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
            
        
            
            
    
        
	Статус: Активный участник
  Группы: Участники
 Зарегистрирован: 17.09.2010(UTC) Сообщений: 73  Откуда: АО ИНФИНИТУМ, Москва Сказал «Спасибо»: 3 раз
  
	 
	
     | 
    
        
            
		      
                Вопрос можно переформулировать таким образом: Как в .NET добавить вторую подпись так же, как это делает КриптоАРМ (правой клавишей по sig файлу) ? 
            
	  
         
     | 
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
    
        
            
            
    
        
	Статус: Сотрудник
  Группы: Администраторы
 Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,417  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 729 раз в 630 постах
  
	 
	
     | 
    
         | 
 | 
            
	 
        
    
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
            
        
            
            
    
        
	Статус: Активный участник
  Группы: Участники
 Зарегистрирован: 17.09.2010(UTC) Сообщений: 73  Откуда: АО ИНФИНИТУМ, Москва Сказал «Спасибо»: 3 раз
  
	 
	
     | 
    
        
            
		      
                Спасибо! Таким образом все работает, единственное, что смущает, что этот метод создает подпись ДРУГОЙ стороны. Но если в КриптоАРМ эта функция реализована именно таким образом, значит все должно быть правильно.  Еще раз спасибо  
            
	  
         
     | 
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
    
        
            
            
    
        
	Статус: Участник
  Группы: Участники
 Зарегистрирован: 02.04.2015(UTC) Сообщений: 11  Откуда: Казань  
	 
	
     | 
    
        
            
		      
                Автор: maxdm   на javascript с помощью capicom или cadescom можно реализовать то же самое?  
            
	  
         
     | 
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
            
        
            
            
    
        
	Статус: Сотрудник
  Группы: Участники
 Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,987   Сказал «Спасибо»: 605 раз Поблагодарили: 2350 раз в 1846 постах
  
	 
	
     | 
    
        
            
		      
                Автор: plov  Автор: maxdm   на javascript с помощью capicom или cadescom можно реализовать то же самое?  Да.    | 
 | 
            
	 
        
    
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
    
        
            
            
    
        
	Статус: Новичок
  Группы: Участники
 Зарегистрирован: 16.06.2017(UTC) Сообщений: 8  Откуда: Мск Сказал(а) «Спасибо»: 3 раз
  
	 
	
     | 
    
        
            
		      
                А есть возможность два отдельных sig файла склеить в один sig? Без переподписания и в любом порядке? 
            
	  
         
     | 
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
            
        
            
            
    
        
	Статус: Активный участник
  Группы: Участники
 Зарегистрирован: 26.08.2010(UTC) Сообщений: 259 Откуда: Moscow
  Сказал(а) «Спасибо»: 4 раз Поблагодарили: 11 раз в 10 постах
  
	 
	
     | 
    
        
            
		      
                Автор: kad  А есть возможность два отдельных sig файла склеить в один sig? Без переподписания и в любом порядке?  Канешно есть, дарагой.   copy a+b >c НО это то же что склеить указы о премии и выговоре. Ежели серьезно, то можно: парсим структуры ASN1 подписей, смотрим на структуру подписи двумя подписантами и склеиваем. Это будет полный бардак и не стоит усилий. Я в свое время разбирался с detached подписями. Attached подписи могут быть от разных провайдеров ГОСТ+RSA, а вот для Detacet пришлось делать кроватки для каждого варианта подписанта Спасибо Елене Новожиловой.   
            
	  
         
     | 
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
    
	                           
	
    
        Быстрый переход
         
	
    
    Вы не можете создавать новые темы в этом форуме.
	
	Вы не можете отвечать в этом форуме.
	
	Вы не можете удалять Ваши сообщения в этом форуме.
	
	Вы не можете редактировать Ваши сообщения в этом форуме.
	
	Вы не можете создавать опросы в этом форуме.
	
	Вы не можете голосовать в этом форуме.
	
	
    
    
        Important Information:
        The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
        
        
More Details
        Close