Ключевое слово в защите информации
ключевое слово
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline lelik1973  
#1 Оставлено : 4 апреля 2022 г. 12:01:02(UTC)
lelik1973

Статус: Участник

Группы: Участники
Зарегистрирован: 23.03.2022(UTC)
Сообщений: 11
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 5 раз
Уважаемые коллеги, добрый день!
В рамках интеграции с ГИС ЖКХ я реализую подписание XML средствами расширения для Python в соответствии с примером https://docs.cryptopro.r.../pycades-sign-verify-xml
В результате генерируются атрибуты SigningCertificateV2, что соответствует стандарту, но не соответствует текущим возможностям ГИС ЖКХ. “В текущей версии Государственной информационной системы жилищно-коммунального хозяйства SigningCertificateV2 не поддерживается, рекомендуем использовать SigningCertificate.”
Я нашел статью Особенности создания подписанных CMS сообщений в КриптоПро CSP 3.6 и выше (https://cpdn.cryptopro.ru/content/capilite40/html/cadesattrs.html), но не понимаю, применимо ли это в моем случае (linux, python) и как?
Можно ли осуществить подписание XML XAdES-BES с использованием метода SignedXML.Sign и атрибута SigningCertificate? Если нет, то как правильно реализовать подписание?
Offline two_oceans  
#2 Оставлено : 5 апреля 2022 г. 8:38:16(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 397 раз в 367 постах
Добрый день.
Не знаю, правильно ли будет, но в теории Вы можете подписать по шаблону на основе подписи XADES-BES с нужными атрибутами, но с указанием более раннего стандарта подписи XMLDSIG, который точно не добавляет атрибутов XADES. Минус в том, что надо будет вставлять атрибуты (десятичный номер сертификата, издатель, время подписания) самостоятельно. Плюс в том, что добавляете что Вам надо.

К слову, как раз воюю с десятичным номером - делаю по алгоритму деления столбиком (так как номера сейчас бывают и по 27 байт длиной в переменную не влазит), остаток сдвигаю влево, подгружаю новые байты справа и столкнулся с тем, что 32-битная программа даже 64-битныю переменную тупо не хочет сдвигать на 32 бита.
thanks 1 пользователь поблагодарил two_oceans за этот пост.
lelik1973 оставлено 05.04.2022(UTC)
Offline lelik1973  
#3 Оставлено : 5 апреля 2022 г. 9:55:50(UTC)
lelik1973

Статус: Участник

Группы: Участники
Зарегистрирован: 23.03.2022(UTC)
Сообщений: 11
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 5 раз
Добрый день!
Да, спасибо! В настоящее время я формирую xml и блок подписи Signature руками на php. Выполняю каноникализацию, вычисляю хэши сертификата, SignedProperties и SignedInfo, с помощью утилиты командной строки cryptcp и SignatureValue с помощью RawSignature.SignHash на python. Жесть, конечно :( Но у меня задача - серверное формирование и подписание xml пакета под linux. К сожалению, пока у меня не получается вычислить корректную подпись (не проходит валидацию на стороне ГИС ЖКХ). Поэтому хотелось бы понять, можно ли воспользоваться более элегантным готовым решением, так сказать, от производителя.
Для получения X509SerialNumber я использую phpseclib https://github.com/phpse...phpseclib/File/X509.php. Уж не знаю на сколько верен реализованный там алгоритм, но может, вам пригодится.
Offline two_oceans  
#4 Оставлено : 5 апреля 2022 г. 11:19:01(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 397 раз в 367 постах
Автор: lelik1973 Перейти к цитате
Добрый день!
Да, спасибо! В настоящее время я формирую xml и блок подписи Signature руками на php. Выполняю каноникализацию, вычисляю хэши сертификата, SignedProperties и SignedInfo, с помощью утилиты командной строки cryptcp и SignatureValue с помощью RawSignature.SignHash на python. Жесть, конечно :( Но у меня задача - серверное формирование и подписание xml пакета под linux. К сожалению, пока у меня не получается вычислить корректную подпись (не проходит валидацию на стороне ГИС ЖКХ). Поэтому хотелось бы понять, можно ли воспользоваться более элегантным готовым решением, так сказать, от производителя.
Ну так и я про это. Хотя например, я не уловил в чем проблема подписать на phpcades, если ранее уже вызвали тот же интерфейс с питона. Есть SignedXML, в нем есть подпись по шаблону.

Берете образец подписанного файла, вырезаете из него тег Signature с нужной структурой XADES-BES, опустошаете SignatureValue DigestValue (в двух Reference насколько помню), вставляете свои значения свойств сертификата и время подписания. Модифицированный тег Signature вставляете, где он должен быть в Вашем файле, всю эту радость и свой сертификат подаете на "подписание по шаблону" в SignedXML, указывая тип XMLDSIG. При этом должны автоматически каноникализироваться фрагменты и быть заполнены значения SignatureValue DigestValue.

Если все верно, то проверка через SignedXML должна пройти не только по XMLDSIG, но и по XADES-BES. Правда, насколько помню, там был еще момент, что ГИС ЖКХ при проверке каноникализирует SignedProperties хотя трансформ каноникализации не указан - для пользования средствами "от производителя" его надо указывать явно. Если используете рандомные id с guid там конечно будет больше работы их везде поменять.
Автор: lelik1973 Перейти к цитате
Для получения X509SerialNumber я использую phpseclib https://github.com/phpse...phpseclib/File/X509.php. Уж не знаю на сколько верен реализованный там алгоритм, но может, вам пригодится.
Нет, там про то как достать X509SerialNumber, это я умею. Пишут, что номер до 20 байт, но отечественные сертификаты могут иметь номера длиннее. Однако в самом сертификате номер двоичный, и длинный, а в SignedProperties надо указывать не в двоичном и не в шестнадцатиричном виде и не в base64, которые получить вообще без вопроса по частям, а в десятичном, за что хочется разработчикам стандарта XADES сказать много добрых слов. Переводить в некратную степени 2 систему счисления та еще радость, так как один символ результата содержит дробное количество бит и границы байт "сползают" после каждого деления и надо держать под рукой соседние байты. Понятно, когда длина номера менее 8 байт, в крайнем случае 16 байт, его можно положить в порядковый целочисленный тип и дальше есть штатные операции деления в командах процессора. Есть даже двоично-десятичная система, но вся эта роскошь пока размер не превышает 8/16 байт.

Ну по ссылке видимо вся "магия" засунута в конструктор класс BigInteger.

Отредактировано пользователем 5 апреля 2022 г. 11:24:43(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил two_oceans за этот пост.
lelik1973 оставлено 05.04.2022(UTC)
Offline lelik1973  
#5 Оставлено : 5 апреля 2022 г. 13:28:29(UTC)
lelik1973

Статус: Участник

Группы: Участники
Зарегистрирован: 23.03.2022(UTC)
Сообщений: 11
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 5 раз
Большое Вам человеческое спасибо! Я просто не очень понимал как работает подпись по шаблону, а вы все очень подробно объяснили. Буду пробовать. На сколько я понимаю, у меня будет та же проблема с номером сертификата?
Вот еще ссылка на хороший пример интеграции с ГИС ЖКХ на .Net (C#) https://github.com/Good-Samaritan. Там для извлечения информации о сертификате, в том числе номера, используется библиотека Bouncy Castle Cryptography API (https://www.bouncycastle.org/). На их сайте есть исходный код и можно посмотреть как она устроена.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.