Статус: Участник
  Группы: Участники
 Зарегистрирован: 27.05.2020(UTC) Сообщений: 28  Сказал(а) «Спасибо»: 1 раз
  
	 
	
     | 
    
        
            
		      
                Думаю, что следует попробовать с RSA-SHA256 и RSA-SHA384. Создать self-signed сертификаты в openssl и подписать xml документ аналогичным способом. Если проверку пройдёт, значит проблема не в различиях реализаций канонизации в Python и Net. 
            
	  
         
     | 
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
            
        
            
            
    
        
	Статус: Сотрудник
  Группы: Администраторы
 Зарегистрирован: 16.09.2010(UTC) Сообщений: 1,578 Откуда: КРИПТО-ПРО
  Сказал(а) «Спасибо»: 38 раз Поблагодарили: 539 раз в 377 постах
  
	 
	
     | 
    
        
            
		      
                Автор: Dmitrii F  Думаю, что следует попробовать с RSA-SHA256 и RSA-SHA384. Создать self-signed сертификаты в openssl и подписать xml документ аналогичным способом. Если проверку пройдёт, значит проблема не в различиях реализаций канонизации в Python и Net.  Кстати, да, безотносительно ГОСТа попробовать -- хорошая мысль.    | 
 | 
            
	 
        
    
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
    
        
            
            
    
        
	Статус: Участник
  Группы: Участники
 Зарегистрирован: 27.05.2020(UTC) Сообщений: 28  Сказал(а) «Спасибо»: 1 раз
  
	 
	
     | 
    
        
            
		      
                Откреплённые подписи, созданные средствами openssl,  на основе алгоритмов rsa-sha256, rsa-sha384,  проверку функцией  не прошли. Ключ и сертификат rsa-sha256 рассчитывались следующим образом: Код:
   openssl req -newkey rsa:2048  -nodes -out c_rsa_sha256.csr -keyout example_rsa_sha256.key
   openssl req -x509 -sha256 -in c_rsa_sha256.csr -out example_rsa_sha256.pem -signkey example_rsa_sha256.key -days 365
 
 Рассчёт Digest и Signature: Код:openssl dgst -binary -sha_256 c.xml #получение значения digest, c.xml - канонизированный xml
openssl dgst -sign private_key -binary -sha_256 digest_value #получение значения signature, 
#private_key - ключ, digest_value - полученное ранее значение digest 
 Аналогичным образом, для rsa-sha384 Канонизация проводилась в соответвии со спецификацией: Код:http://www.w3.org/2001/10/xml-exc-c14n#WithComments 
 методами библиотеки lxml.etree Python Описание алгоритмов в xml, в соответвии с  спецификациейК примеру, для rsa-sha384: Код:
<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha384"/>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#sha384"/>
 
 Значения Digest и Signature - в виде строкового представления base64: Код:
DigestValue.base64.b64encode.decode('utf8')
SignValue.base64.b64encode.decode('utf8')
 
  Проверка производилась для Net.v4  
            
	  
         
     | 
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
            
        
            
            
    
        
	Статус: Участник
  Группы: Участники
 Зарегистрирован: 27.05.2020(UTC) Сообщений: 28  Сказал(а) «Спасибо»: 1 раз
  
	 
	
     | 
    
        
            
		      
                Если производить обратное действие, т.е. рассчитывать Signature и Digest средствами Net.,  то, как указано  здесь для алгоритма sha1, верификация Signature публичным ключём в openssl, проходит успешно. Поэтому, предполаю, что всё-таки дело в канонизации, а не в различным с .Net вычислении Digest и Signature средствами openssl (Если только это не работает исключительно в одном направлении, т.е. .Net--->openssl , но не openssl--->.Net) Следующим шагом надо будет получить в Net. каноническое представление xml документа и рассчитывать Digest и Signature средствами openssl, наверное, даже для rsa-sha1, чтобы наверняка. И проверить его.  Ещё, можно дополнительно рассчитать Digest средствами Net. и сравнить его со значением, получаемым в openssl. Отредактировано пользователем 1 июня 2020 г. 23:05:48(UTC)
 | Причина: pkcs12 тут не причем  
            
	  
         
     | 
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
    
        
            
            
    
        
	Статус: Участник
  Группы: Участники
 Зарегистрирован: 27.05.2020(UTC) Сообщений: 28  Сказал(а) «Спасибо»: 1 раз
  
	 
	
     | 
    
        
            
		      
                Итак, код для расчёта канонической формы xml документа и значения Digest (sha256, gost3411_2012_256),  а также, последующей их записи в отдельные файлы, средствами .Net VB такой: Код:
        'Create and load source xml document
        Dim xmlDocument As XmlDocument = New XmlDocument()
        xmlDocument.PreserveWhitespace = True
        xmlDocument.Load(args(0))
        Dim c14 As XmlDsigExcC14NWithCommentsTransform = New XmlDsigExcC14NWithCommentsTransform()
        c14.LoadInput(xmlDocument)
        'Digest value
        'sha256
        Dim digestBase64String As String = Convert.ToBase64String(c14.GetDigestedOutput(SHA256.Create()))
        File.WriteAllText(args(0) + "_DigestValue.dgst", digestBase64String)
        'Gost3411_2012_256
        Dim digestBase64String_gost3411 As String  =Convert.ToBase64String(c14.GetDigestedOutput(Gost3411_2012_256.Create()))
        File.WriteAllText(args(0) + "_DigestValue_gost3411.dgst", digestBase64String_gost3411)
        'Canonicalization
        Dim sw As New StreamReader(DirectCast(c14.GetOutput(), MemoryStream))
        Dim canonicXML As String = sw.ReadToEnd()
        File.WriteAllText(args(0) + "_ExcC14NWithComments.xml", canonicXML)
 
 Значение Digest (для sha256 и gost3411_2012_256) я проверил, оно идентично с рассчитанным средствами openssl + Python.lxml.etree Из, этого, вероятнее всего, следует, что и канонические формы xml файла в .Net и Python.lxml.etree совпадают. Ещё (чтобы наверняка), следует сравнить отдельно канонические формы xml файла. Отредактировано пользователем 1 июня 2020 г. 23:43:14(UTC)
 | Причина: добавил gost3411_2012_256  
            
	  
         
     | 
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
            
        
            
            
    
        
	Статус: Участник
  Группы: Участники
 Зарегистрирован: 27.05.2020(UTC) Сообщений: 28  Сказал(а) «Спасибо»: 1 раз
  
	 
	
     | 
    
        
            
		      
                По всей видимости, нужно посмотреть в исходный код функции  , чтобы выястить в чём дело и какие дополнительные "флаги" указывать openssl.  
            
	  
         
     | 
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
    
        
            
            
    
        
	Статус: Участник
  Группы: Участники
 Зарегистрирован: 27.05.2020(UTC) Сообщений: 28  Сказал(а) «Спасибо»: 1 раз
  
	 
	
     | 
    
        
            
		      
                Сравнил канонические формы Python lxml.extree и .Net. в kdiff3 Они оказались идентичны: Код:Files A and B are binary equal 
 Проверку публичным ключем Signature проходит: Код:
openssl x509 -pubkey -in example_rsa_sha256.pem>example_rsa_sha256_pub.key #Создание публичного ключа (вместе с сертификатом) на основании сертификата
openssl dgst -sha256 -verify example_rsa_sha256_pub.key -signature in_file.sign in_file.digest #Верификация Signature in_file.sign, созданной на основе Digest -  in_file.digest
 
 Отредактировано пользователем 2 июня 2020 г. 10:48:40(UTC)
 | Причина: Не указана  
            
	  
         
     | 
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
            
        
            
            
    
        
	Статус: Участник
  Группы: Участники
 Зарегистрирован: 27.05.2020(UTC) Сообщений: 28  Сказал(а) «Спасибо»: 1 раз
  
	 
	
     | 
    
        
            
		      
                В  .Net сертификат проверяется дополнительно: (Из документации) Цитата:If an XML document was signed with an X.509 signature, the CheckSignature method will search the "AddressBook" store for certificates suitable for the verification. For example, if the certificate is referenced by a Subject Key Identifier (SKI), the CheckSignature method will select certificates with this SKI and try them one after another until it can verify the certificate.  И  здесь исходный код проверки Здесь указано, что сертификат : 
 
 - проверяется на наличие расширений keyUsage, если есть, то должны быть digitalSignature и(или) nonRepudiation
  - проверяется вся цепочка до корневого CA - сертификата
  - проверяется, не был ли сертификат отозван
  - проверяется не истёк ли срок действия сертифката на данный момент
  - проверяется, что ни один из сертификатов в цепочке до корневого CA не был запрещён в ОС
  
 Отредактировано пользователем 2 июня 2020 г. 12:29:29(UTC)
 | Причина: Не указана  
            
	  
         
     | 
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
    
        
            
            
    
        
	Статус: Участник
  Группы: Участники
 Зарегистрирован: 27.05.2020(UTC) Сообщений: 28  Сказал(а) «Спасибо»: 1 раз
  
	 
	
     | 
    
        
            
		      
                Включил логирование проверки Xml, вывод (часть): Код:
System.Security.Cryptography.Xml.SignedXml Information: 14 : [SignedXml#00245fb7, VerifySignedInfo] Проверка SignedInfo с использованием ключа RSACryptoServiceProvider#01475d71, описания подписи RSAPKCS1SHA256SignatureDescription, алгоритма хэширования SHA256Cng и модуля удаления формата асимметричной подписи RSAPKCS1SignatureDeformatter.
System.Security.Cryptography.Xml.SignedXml Verbose: 14 : [SignedXml#00245fb7, VerifySignedInfo] Фактическое хэш-значение: f1d10cdb0bacc7b910cc62a56b688b26ebfad1de640a507475674bd76910d533
System.Security.Cryptography.Xml.SignedXml Verbose: 14 : [SignedXml#00245fb7, VerifySignedInfo] Исходная подпись: 29c2df6dd571b6855b6f5ec20e59144cc4829ed8f599c3c024470a31e698758d33686298421445576db160bf700ab81bc55b4aa54f7540b6a000cb7929eaea92f90a5611229ef63918f3da461f0143fc5ccc6f84a60af6937c56c93a4db1ce96ed4e7809645c2dd9b4d58dc99a3738917c0f9d953e0c0ff28ec7b2e07ea21df688ea552befa6cb6ae7c466cf9031b7f5994fb9b241f0c138c9b0aff35bbc07c3c976edbc1e12adc14306f3898b9cc4c31c5c46215510eb3b660ffa1ca4f800ba1b3107904fe25eec9ec71d015240c415f852152e8e2e8cb0db053f686edd323337ec2335f534926af62d4359353d70ee635b11e37e248aef1d34db01909866da
System.Security.Cryptography.Xml.SignedXml Information: 12 : [SignedXml#00245fb7, VerificationFailure] Проверка SignedInfo не прошла.
System.Security.Cryptography.Xml.SignedXml Information: 9 : [SignedXml#00245fb7, SignatureVerificationResult] Проверка с ключом RSACryptoServiceProvider#01475d71 не прошла.
 
 Похоже, что проверку не проходит в функции  Код:SignedXml.CheckSignedInfo 
 Вот только отладить нормально не получается.  
            
	  
         
     | 
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
            
        
            
            
    
        
	Статус: Участник
  Группы: Участники
 Зарегистрирован: 27.05.2020(UTC) Сообщений: 28  Сказал(а) «Спасибо»: 1 раз
  
	 
	
     | 
    
        
            
		      
                Упаковав сертификат rsa-sha256 с закрытым ключём в формат pkcs12, создал откреплённую подпись для xml документа средствами .Net , импортировав сертификат и ключ: Код:
Dim cert As X509Certificate2 = New X509Certificate2("cert.p12", "password")
Dim Key As AsymmetricAlgorithm = cert.PrivateKey
 
 Единственный момент, что в данном случае, алгоритм рассчёта Signature:rsa-sha256 не подошёл (исключение) почему-то, хотя я и создавал сертификат rsa-sha256: Код:
openssl x509 -req -sha256 -in c_rsa_sha256.csr -out example_rsa_sha256.pem -signkey example_rsa_sha256.key -days 365
 
 Поэтому, пришлось вручную выставить алгоритм rsa-sha1: Код:
SignedXML_.SignedInfo.SignatureMethod = SignedXml.XmlDsigRSASHA1Url
 
 Такая подпись проверку прошла. Значит, сертификат валидный для .Net.  
            
	  
         
     | 
    | 
         
             
     | 
    
         
            
         
     | 
    | 
        
	
     | 
        
        
        
    
	                           
	
    
        Быстрый переход
         
	
    
    Вы не можете создавать новые темы в этом форуме.
	
	Вы не можете отвечать в этом форуме.
	
	Вы не можете удалять Ваши сообщения в этом форуме.
	
	Вы не можете редактировать Ваши сообщения в этом форуме.
	
	Вы не можете создавать опросы в этом форуме.
	
	Вы не можете голосовать в этом форуме.
	
	
    
    
        Important Information:
        The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
        
        
More Details
        Close