Структура PKCS7-файла / Хабр

Asn.1

Что же такое Cryptographic Message Syntax? Это

, описывающий структуру сообщений, полученных с использованием криптографии.

В стандарте описывается шесть типов данных: data, signedData, envelopedData, signedAndEnvelopedData, digestedData, and encryptedData. В данном топике я расскажу о типе signedData (данные с электронной подписью).

Прежде всего следует сказать, что стандартный p7s файл имеет ASN.1 структуру.ASN.1 — формат записи, с помощью которого можно описывать сложные структуры данных, состоящие из различных типов. Приведу краткую выдержку из своего старого топика про x.509 сертификаты:

ASN.1-кодировка описывается следующим правилом. Сперва записываются байты, характеризующий тип данных, затем последовательность байтов хранящих сведения о длине данных и лишь после этого следуют сами данные.

К примеру, для кодировки целого числа INTEGER 65537 используется следующая форма: 0203 01 00 01.
Здесь первый байт 02, определяет тип INTEGER (полную таблицу типов вы можете найти например тут), второй байт 03 показывает длину блока. А следующие за этим байты 01 00 01, являются шестнадцатеричной записью нашего числа 65537.

В нашем случае, для описание простейшего самоподписанного сертификата, достаточно 9 типов данных. Приведем таблицу кодирования для этих типов:

Наименование типаКраткое описаниеПредставление типа в DER-кодировке
SEQUENCEИспользуется для описания структуры данных, состоящей из различных типов.30
INTEGERЦелое число.02
OBJECT IDENTIFIERПоследовательность целых чисел.06
UTCTimeВременной тип, содержит 2 цифры для определения года17
GeneralizedTimeРасширенный временной тип, содержит 4 цифры для обозначения года.18
SETОписывает структуру данных разных типов.31
UTF8StringОписывает строковые данные.0C
NULLСобственно NULL05
BIT STRINGТип для хранения последовательности бит.03

Подробное описание ASN.1 дано в статье

. Я же просто расскажу какие сведения можно извлечь из самого обыкновенного p7s файла.

Аккорд | асц

Довольно часто на Государственных порталах требуется присоединить вместе с документом *.sig — файл вашей электронной подписи. И с первого раза не всегда получается правильно это сделать.

Рассмотрим по примеру как получить файл *.sig — файл электронной подписи:

Сперва необходимо установить, и запустить программу КриптоАРМ

Структура PKCS7-файла / Хабр

Мы увидим рабочий интерфейс программы. Необходимо найти кнопку«Подписать»

Структура PKCS7-файла / Хабр

После чего мы увидим мастера создания *.sig — файла электронной подписи. На этом этапе нажимаем«Далее»

Структура PKCS7-файла / Хабр

   Далее Вам необходимо выбрать нужный файл(документ), который требуется загрузить на вашу электронную площадку(на основании этого файла и будет создан *.sig — файл электронной подписи). Нажимаем на кнопку«Добавить файл»

Структура PKCS7-файла / Хабр

И выбираем нужный документ на основании которого и будет создан *.sig — файл

Структура PKCS7-файла / Хабр

Как видим нужный документ успешно добавлен. Нажимаем«Далее»

Структура PKCS7-файла / Хабр

   На следующих этапах нужно убедится что у нас правильно выставлены настройки формирования *.sig — файла, и нажимаем на кнопку«Далее«

Структура PKCS7-файла / Хабр

Проверяем следующие настройки, и еще раз«Далее»

Структура PKCS7-файла / Хабр

   Теперь необходимо нажать на кнопку«Выбрать», для перехода в список электронных подписей которые есть на Вашем компьютере

Структура PKCS7-файла / Хабр

На этом этапе необходимо выбрать Вашу электронную подпись, и нажать«ОК»

Структура PKCS7-файла / Хабр

   После чего Вы можете убедится в том что Вы выбрали необходимую подпись, и перейти к последнему этапу формирования файла *.sig нажатием кнопки«Далее«

Структура PKCS7-файла / Хабр

Последний этап формирования файла *.sig. Теперь смело нажимаем кнопку«Готово»

Структура PKCS7-файла / Хабр

Ваш *.sig файл успешно создан. Нажимаем кнопку«Закрыть»

Структура PKCS7-файла / Хабр

   После чего идем в папку где хранится Ваш файл(документ), и рядом видим Ваш созданный файл *.sig. Теперь его можно загрузить на соответствующую площадку, и отправить.

Структура PKCS7-файла / Хабр

§

§

§

Встроенная эп

Подписание внутри документов Word, Excel, PDF с помощью дополнительного ПО КриптоПро Office Signature и КриптоПро PDF.Формат исходного документа не меняется, информацию о подписи можно просмотреть, открыв документ. Если в документ после подписания внести изменения, подпись будет определяться как недействительная.

Читайте также:  USB-ключи. Токены. Электронные идентификаторы. Купить в

Открепленная (отсоединенная) эп

  • Файл подписи создается отдельно от подписываемого файла.
  • Для проверки подписи нужно передавать два файла — исходный документ и файл подписи.
  • Нет ограничения по формату подписываемых документов.
  • Созданный файл подписи имеет, как правило, расширение.sig,.sgn,.p7s.
  • Есть возможность создать усовершенствованную открепленную подпись, такой файл содержит отметку времени.
  • Можно создать файл, содержащий подписи нескольких лиц.

Проверку созданной открепленной подписи контрагент может выполнить в программах (КриптоАРМ или аналоги), предназначенных для проверки электронных документов с отсоединенной подписью.

Программное обеспечение для эцп

Плагин, позволяющий создавать встроенную подпись в документах Word и Excel. Можно создать неотображаемую подпись, которую будет видно только на вкладке подписей, или строку подписи в самом документе. Строка подписи представляет собой графический объект, который можно переместить на любое место в тексте документа, содержит в себе как сведения о подписавшем, так и произвольный рисунок. Есть возможность создания нескольких подписей в одном документе.

После того, как в документе появилась цифровая подпись, он автоматически помечается как окончательный и доступен только для чтения. Любое действие по редактированию документа приведёт к тому, что все подписи из документа будут помечены как недействительные.

Плагин для создания подписи внутри документов PDF. Можно создать видимую подпись (отображается на панели Подписи, и в виде поля подписи в документе), или невидимую (отображается только на панели Подписи). Также позволяет настроить разрешенные изменения, при которых подпись останется действующей (например, добавление комментариев). Есть возможность создания усовершенствованной подписи с отметкой времени.

Совмещенная (прикрепленная/присоединенная) эп

Разновидность электронной подписи, при создании которой формируется файл, содержащий как саму электронную подпись, так и исходный документ.Создать такую подпись можно через КриптоАРМ. В той же папке, в которой хранился исходный документ, появится файл с аналогичным названием, но с расширением, как правило,.sig,.sgn. Размер этого файла несколько больше, чем размер исходного документа.

Отправлять контрагенту нужно будет только этот файл. Для проверки и прочтения документа у контрагента должно быть установлено ПО, поддерживающее работу с прикрепленной подписью.

Читайте также:  КриптоПро | КриптоПро PDF - Часто задаваемые вопросы

Структура p7s файла

приводится описание структуры файла содержащего сведения об ЭЦП.

   SignedData ::= SEQUENCE {
        version CMSVersion,
        digestAlgorithms DigestAlgorithmIdentifiers,
        encapContentInfo EncapsulatedContentInfo,
        certificates [0] IMPLICIT CertificateSet OPTIONAL,
        crls [1] IMPLICIT RevocationInfoChoices OPTIONAL,
        signerInfos SignerInfos }


Согласно стандарту, файл с цифровой подписью в CSM формате должен содержать следующие поля:

  • CMSVersion — целое число, обозначающее версию используемого синтаксиса.
  • DigestAlgorithmIdentifiers — идентификатор одной или нескольких хеш-функций которые используются при вычислении подписей.
  • EncapsulatedContentInfo — собственно данные, которые были подписаны.
  • CertificateSet — набор всех необходимых сертификатов, необходимых для проверки подписей.
  • RevocationInfoChoices — набор списков отзыва сертификатов.
  • SignerInfos — структура данных содержащая информацию о подписанте.

Для того чтобы понять как это выглядит на практике подпишем произвольный набор байт тестовым сертификатом и сгенерируем p7s файл с типом SignedData.

Получившийся файл будет иметь ASN.1 структуру:


Используя

можно легко разобрать что скрывается за шестнадцатеричным кодом.

SEQUENCE {
   OBJECTIDENTIFIER 1.2.840.113549.1.7.2 (signedData)
   [0] {
      SEQUENCE {
         INTEGER 0x01 (1 decimal)
         SET {
            SEQUENCE {
               OBJECTIDENTIFIER 1.3.14.3.2.26 (id_sha1)
               NULL 
            }
         }
         SEQUENCE {
            OBJECTIDENTIFIER 1.2.840.113549.1.7.1 (data)
            [0] {
               OCTETSTRING 540065007300740020006D00650073007300610067006500
            }
         }
         [0] {
            SEQUENCE {
               SEQUENCE {
                  [0] {
                     INTEGER 0x02 (2 decimal)
                  }
                  INTEGER 0x00D901B8B82F74CA0E8D84485A2265E1C3
                  SEQUENCE {
                     OBJECTIDENTIFIER 1.2.840.113549.1.1.5 (sha1WithRSAEncryption)
                     NULL 
                  }
                  SEQUENCE {
                     SET {
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.4.3 (commonName)
                           UTF8String 'Test CA'
                        }
                     }
                     SET {
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.4.10 (organizationName)
                           UTF8String 'Test'
                        }
                     }
                  }
                  SEQUENCE {
                     UTCTime '150429123320Z'
                     UTCTime '150506123320Z'
                  }
                  SEQUENCE {
                     SET {
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.4.12 (title)
                           UTF8String 'Test'
                        }
                     }
                     SET {
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.4.11 (organizationalUnitName)
                           UTF8String 'Test'
                        }
                     }
                     SET {
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.4.10 (organizationName)
                           UTF8String 'Test'
                        }
                     }
                     SET {
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.4.3 (commonName)
                           UTF8String '[TEST] Test'
                        }
                     }
                  }
                  SEQUENCE {
                     SEQUENCE {
                        OBJECTIDENTIFIER 1.2.840.113549.1.1.1 (rsaEncryption)
                        NULL 
                     }
                     BITSTRING 0x308189028181009298ED87B0E9DB66AB06D18E7B1B1740109881D306F3B5CAA7FCD4FFCBA22D9848F9
                     1E10250FC61C455DB7A6765760E7BFBFDB66E0D7FC1F0BA1991BEEC00DAA76EE9AB8C6855DD5C8FAAFF8FD1267D
                     E6F2DBE5C3EB1881F49B290AADDB285A646BA9314658CC5205AAC59625951F17FBC1E7AD79FF88B3B482A432B7E20
                     444B0203010001 : 0 unused bit(s)
                  }
                  [3] {
                     SEQUENCE {
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.29.15 (keyUsage)
                           OCTETSTRING 030204F0
                        }
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.29.37 (extKeyUsage)
                           BOOLEAN TRUE
                           OCTETSTRING 302006082B0601050507030406082B06010505070302060A2B0601040182370A030C
                        }
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.29.14 (subjectKeyIdentifier)
                           OCTETSTRING 0414C7058A12A4B5B73EF4E5876C34B9BB32155E9691
                        }
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.29.35 (authorityKeyIdentifier)
                           OCTETSTRING 301680146AE7AB14AAE8B4C0A89E189D8168B1199FFB25B0
                        }
                     }
                  }
               }
               SEQUENCE {
                  OBJECTIDENTIFIER 1.2.840.113549.1.1.5 (sha1WithRSAEncryption)
                  NULL 
               }
               BITSTRING 0x2007EFBF72C4EDB88FB4036AB8F90E1684897FB5C50E3117CF809DB1FBC1C68BCF3F9C34517621552930E9F
               3B739F54CE081C1047067C50CAE0780B244CB183F0E6867BCEBAA95758F7C18465BAD963070CA630999548687270AD6DE3
               6266A856453B5032259727F3E464360C2AAEC709EF70F13F5D66649ECFE7A5219D12740 : 0 unused bit(s)
            }
         }
         SET {
            SEQUENCE {
               INTEGER 0x01 (1 decimal)
               SEQUENCE {
                  SEQUENCE {
                     SET {
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.4.3 (commonName)
                           UTF8String 'Test CA'
                        }
                     }
                     SET {
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.4.10 (organizationName)
                           UTF8String 'Test'
                        }
                     }
                  }
                  INTEGER 0x00D901B8B82F74CA0E8D84485A2265E1C3
               }
               SEQUENCE {
                  OBJECTIDENTIFIER 1.3.14.3.2.26 (id_sha1)
                  NULL 
               }
               SEQUENCE {
                  OBJECTIDENTIFIER 1.2.840.113549.1.1.1 (rsaEncryption)
                  NULL 
               }
               OCTETSTRING 571404A32C015B61B957F002950A33E09475CA66DED090938AE21AFE6E0B39C9023850DE7C38482736E97
               BFF6CB4DBB0605CCD787854525499A9C42B28D7BAAD19B26D0D43B6231B5EDCB23E70FFB4681D1C3B6FD5A40D508F55
               457E047D2CC5C3803A2327D2E2B41A052ED13E3A1E9788D912AEB35649E93497EF4770E1669E
            }
         }
      }
   }
}

Начнем по порядку. Как видно из примера, p7s файл представляет собой одну большую структуру данных с типом SEQUENCE, включающую в себя все описанные в стандарте поля.Открывает блок тип данных OBJECTIDENTIFIER со значением 1.2.840.113549.1.7.2 (SignedData), который однозначно дает понять с какого рода объектом мы имеем дело.После чего один за другим следуют блоки:

Помимо приведенных выше обязательных полей в объекте с типом SignedData могут использоваться опциональные поля, такие как signedAttributes, добавляемые в блок SignerInfo. SignedAttributes добавляются при вычислении хеш-значения от подписываемых данных, поэтому изменение этих полей делает подпись недействительной.Если блок SignedAttributes используется, то он должен содержать минимум два поля:

  • Поле описывающее тип данных, содержащихся в блоке contentInfo
  • Поле хранящее хеш-значение блока contentInfo
Читайте также:  Электронная подпись купить в Новомосковске — самая выгодная цена на официальном сайте


Рассмотрим еще один пример p7s файла, созданного с использованием SignedAttributes.

SEQUENCE {
   OBJECTIDENTIFIER 1.2.840.113549.1.7.2 (signedData)
   [0] {
      SEQUENCE {
         INTEGER 0x01 (1 decimal)
         SET {
            SEQUENCE {
               OBJECTIDENTIFIER 1.3.14.3.2.26 (id_sha1)
               NULL 
            }
         }
         SEQUENCE {
            OBJECTIDENTIFIER 1.2.840.113549.1.7.1 (data)
            [0] {
               OCTETSTRING 540065007300740020006D00650073007300610067006500
            }
         }
         [0] {
            SEQUENCE {
               SEQUENCE {
                  [0] {
                     INTEGER 0x02 (2 decimal)
                  }
                  INTEGER 0x00D901B8B82F74CA0E8D84485A2265E1C3
                  SEQUENCE {
                     OBJECTIDENTIFIER 1.2.840.113549.1.1.5 (sha1WithRSAEncryption)
                     NULL 
                  }
                  SEQUENCE {
                     SET {
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.4.3 (commonName)
                           UTF8String 'Test CA'
                        }
                     }
                     SET {
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.4.10 (organizationName)
                           UTF8String 'Test'
                        }
                     }
                  }
                  SEQUENCE {
                     UTCTime '150429123320Z'
                     UTCTime '150506123320Z'
                  }
                  SEQUENCE {
                     SET {
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.4.12 (title)
                           UTF8String 'Test'
                        }
                     }
                     SET {
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.4.11 (organizationalUnitName)
                           UTF8String 'Test'
                        }
                     }
                     SET {
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.4.10 (organizationName)
                           UTF8String 'Test'
                        }
                     }
                     SET {
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.4.3 (commonName)
                           UTF8String '[TEST] Test'
                        }
                     }
                  }
                  SEQUENCE {
                     SEQUENCE {
                        OBJECTIDENTIFIER 1.2.840.113549.1.1.1 (rsaEncryption)
                        NULL 
                     }
                     BITSTRING 0x308189028181009298ED87B0E9DB66AB06D18E7B1B1740109881D306F3B5CAA7FCD4FFCBA22D9848F91E102
                     50FC61C455DB7A6765760E7BFBFDB66E0D7FC1F0BA1991BEEC00DAA76EE9AB8C6855DD5C8FAAFF8FD1267DE6F2DBE5C
                     3EB1881F49B290AADDB285A646BA9314658CC5205AAC59625951F17FBC1E7AD79FF88B3B482A432B7E20444B0203010001 : 0 unused bit(s)
                  }
                  [3] {
                     SEQUENCE {
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.29.15 (keyUsage)
                           OCTETSTRING 030204F0
                        }
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.29.37 (extKeyUsage)
                           BOOLEAN TRUE
                           OCTETSTRING 302006082B0601050507030406082B06010505070302060A2B0601040182370A030C
                        }
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.29.14 (subjectKeyIdentifier)
                           OCTETSTRING 0414C7058A12A4B5B73EF4E5876C34B9BB32155E9691
                        }
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.29.35 (authorityKeyIdentifier)
                           OCTETSTRING 301680146AE7AB14AAE8B4C0A89E189D8168B1199FFB25B0
                        }
                     }
                  }
               }
               SEQUENCE {
                  OBJECTIDENTIFIER 1.2.840.113549.1.1.5 (sha1WithRSAEncryption)
                  NULL 
               }
               BITSTRING 0x2007EFBF72C4EDB88FB4036AB8F90E1684897FB5C50E3117CF809DB1FBC1C68BCF3F9C34517621552930E9F
               3B739F54CE081C1047067C50CAE0780B244CB183F0E6867BCEBAA95758F7C18465BAD963070CA630999548687270AD6DE3
               6266A856453B5032259727F3E464360C2AAEC709EF70F13F5D66649ECFE7A5219D12740 : 0 unused bit(s)
            }
         }
         SET {
            SEQUENCE {
               INTEGER 0x01 (1 decimal)
               SEQUENCE {
                  SEQUENCE {
                     SET {
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.4.3 (commonName)
                           UTF8String 'Test CA'
                        }
                     }
                     SET {
                        SEQUENCE {
                           OBJECTIDENTIFIER 2.5.4.10 (organizationName)
                           UTF8String 'Test'
                        }
                     }
                  }
                  INTEGER 0x00D901B8B82F74CA0E8D84485A2265E1C3
               }
               SEQUENCE {
                  OBJECTIDENTIFIER 1.3.14.3.2.26 (id_sha1)
                  NULL 
               }
               [0] {
                  SEQUENCE {
                     OBJECTIDENTIFIER 1.2.840.113549.1.9.3 (contentType)
                     SET {
                        OBJECTIDENTIFIER 1.2.840.113549.1.7.1 (data)
                     }
                  }
                  SEQUENCE {
                     OBJECTIDENTIFIER 1.2.840.113549.1.9.5 (signingTime)
                     SET {
                        UTCTime '150429124539Z'
                     }
                  }
                  SEQUENCE {
                     OBJECTIDENTIFIER 1.2.840.113549.1.9.4 (messageDigest)
                     SET {
                        OCTETSTRING F21FA6C3A1A5756D74B11C65B7D38F7EB9F458B5
                     }
                  }
               }
               SEQUENCE {
                  OBJECTIDENTIFIER 1.2.840.113549.1.1.1 (rsaEncryption)
                  NULL 
               }
               OCTETSTRING 21D1762506C25894B98E6BD3BB11566719AEBF642B7A4541494C45F181880D936ABC28774BA575C53CC
               1CB9551ABA21359FD3FA9013DE4242802674A1C304B2601183EA8015840EEF0D0D0312E361088725A255A869EEC394C
               826712F684E0BA22806BD14404EA1DD80601A8C1E6598F1CCF907EE2891FB58683EEEF121D2312
            }
         }
      }
   }
}

Этот пример отличается от предыдущего наличием дополнительного блока:

[0] {
                  SEQUENCE {
                     OBJECTIDENTIFIER 1.2.840.113549.1.9.3 (contentType)
                     SET {
                        OBJECTIDENTIFIER 1.2.840.113549.1.7.1 (data)
                     }
                  }
                  SEQUENCE {
                     OBJECTIDENTIFIER 1.2.840.113549.1.9.5 (signingTime)
                     SET {
                        UTCTime '150429124539Z'
                     }
                  }
                  SEQUENCE {
                     OBJECTIDENTIFIER 1.2.840.113549.1.9.4 (messageDigest)
                     SET {
                        OCTETSTRING F21FA6C3A1A5756D74B11C65B7D38F7EB9F458B5
                     }
                  }
               }

Именно в нем содержатся SignedAttributes. Помимо двух обязательных атрибутов при подписи был использован атрибут signedTime, который хранит время подписи.

Выводы

Таким образом стандартный p7s файл представляет собой нечто гораздо большее, чем сведения об электронной подписи и открытом ключе подписанта. В нем содержится сложная структура данных, представленная в ASN.1 формате и имеющая ряд обязательных полей, позволяющих получить сведения о подписавшей стороне. А также несколько опциональных полей, которые используются при вычислении итоговой подписи.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector