- PVSM.RU - https://www.pvsm.ru -
Приветствем тебя, хабросообщество.
Самой обсуждаемой новостью текущей недели в рунете, безусловно, является принятие закона №139-ФЗ и его последствий. В силу того, что наша компания [1] предоставляет услуги
В статье мы бы хотели сфокусироваться на техническом аспекте и избежать обсуждения этическо-политической стороны вопроса, т.к. любой активный пользователь уже успел высказать свое недовольство по данной теме, пожалеть рутрекер с луркоморьем и подумать на тему обхода запрета ресурсов ранее.
В настоящий момент доступ к единому реестру запрещенных ресурсов предполагается двух видов:
Во втором случае каждый запрос на выгрузку базы необходимо подписывать ЭЦП, в формате PKCS#7 и передавать отвязанную подпись вместе с запросом. В идеале мы представляли себе примерно такой порядок действий: покупаем ЭЦП, берем привычный нам Debian, ставим туда соответствующее ПО для автоматической подписи запросов, пишем скрипт, который общаясь с сервером zapret-info через SOAP формирует запрос, подписывает его, скачивает дамп и рядом эвристических методов проверяет, не относятся ли к нам какие-либо ресурсы из списка.
Казалось бы, все просто, но на деле оказалось несколько сложней и дольше.
Сервер zapret-info не предоставляет никакой «песочницы», в которой можно было бы протестировать работу скрипта без наличия валидной ЭЦП, поэтому самым первым делом надо озаботиться ее приобритением.
Купить сертификат для создания квалифицированной электронной подписи можно в доверенном удостоверяющем центре [7]. По умолчанию все УЦ для подписывания документов предлагают пользоваться программами из семейства КриптоПРО (КриптоАРМ, cryptcp). К сожалению, пользование этим многообразием программных продуктов омрачает несколько фактов:
Поэтому быстрый поиск в интернете навел нас на информацию о том, что с помощью несложных действий с Рутокеном можно научить работать [8] привычный нам OpenSSL. Краткий бриф наших действий такой:
openssl_conf = openssl_def
В конце новые секции:
[openssl_def]
engines=engine_section
[engine_section]
gost=gost_section
[gost_section]
engine_id=gost
default_algorithms=ALL
$ echo "Test" > document.txt
$ openssl smime -sign -binary -signer ~/sign/gost.crt -inkey ~/sign/gost_nopass.key -outform PEM -in document.txt -out document.txt.sign
и проверить его через форму на госуслугах [10] (раздел «отсоединенная, в формате PKCS#7»). Если подпись проходит проверку — можно двигаться дальше.
Тут тоже оказалось не все так гладко, как хотелось бы. Все дело в том, что на любую проблему выдается малоинформативное вида: «Ошибка! Файл запроса не соответствует требуемому формату». Но методом проб и ошибок были выяснены следующие требования к файлу запроса:
После формирования запроса подписываем его и получаем подпись. Дальше либо отправляем их через метод SOAP sendRequest(), изначально закодировав в base64 содержание файлов запроса и файла подписи, либо отправляем их через форму [11]. Получаем идентификатор запроса, ждем около минуты и проверяем результат обработки запроса (метод getResult(), либо вторая форма на странице запроса).
Кстати, и тут у нас с первого раза не все прошло так гладко. На странице появилась еще одна надпись:
Ошибка! неверный формат ЭП (информация по обратной связи для разрешения проблем приведена в Памятке оператору связи в разделе www.zapret-info.gov.ru/tooperators/ [12])
Тут уже наши догадки закончились и мы написали на почту поддержки: support@rsoc.ru, откуда через несколько часов пришел ответ, что в алгоритм проверки ЭЦП были внесены корректировки и нам нужно попробовать еще раз. Со второго раза проверка прошла успешно и нам был выдан zip-архив, в котором находились дамп реестра и его ЭЦП.
После всех описанных действий, никаких проблем с автоматизацией у нас не возникло. Алгоритм работы примерно такой:
1. проверяем, не изменился ли таймстамп базы;
2. если изменился — формируем запрос, генерируем подпись, отправляем запрос;
3. периодически опрашиваем сервис на предмет готовности результата;
4. если результат есть — получаем архив дампа, разархивируем его и проверяем список ресурсов на принадлежность нашим клиентам.
Пара советов:
Для питона самой удобной реализацией SOAP-клиента оказался модуль suds [13]
lxml.builder ставит одиночные в xml declaration string, поэтому у нас генерация xml запроса выглядит как-то так:
from datetime import datetime
from dateutil.tz import tzlocal
from lxml import etree
from lxml.builder import E
request_xml = E.request(
E.requestTime(datetime.now(tzlocal()).isoformat()),
E.operatorName(settings.NETANGELS_OPERATOR_NAME),
E.inn(settings.NETANGELS_INN),
E.ogrn(settings.NETANGELS_OGRN),
E.email(settings.NETANGELS_EMAIL),
)
# Роскомнадзор не умеют работать с одиночными кавычками и utf-8 :-(
request_str = etree.tostring(request_xml, xml_declaration=True, encoding='windows-1251').replace("'", '"')
Автор: NetAngels
Источник [14]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/linux/20241
Ссылки в тексте:
[1] наша компания: http://www.netangels.ru/
[2] хостинга: https://www.reg.ru/?rlink=reflink-717
[3] главной странице реестра: http://zapret-info.gov.ru/
[4] «операторам связи»: http://zapret-info.gov.ru/tooperators/
[5] веб-форму: http://zapret-info.gov.ru/tooperators/form/
[6] www.zapret-info.gov.ru/services/OperatorRequest/?wsdl: http://www.zapret-info.gov.ru/services/OperatorRequest/?wsdl
[7] доверенном удостоверяющем центре: http://www.reestr-pki.ru/tsl.html
[8] научить работать: http://forum.rutoken.ru/topic/1639/
[9] P12FromGostCSP: http://www.lissi-crypto.ru/products/utils/p12fromcsp/
[10] форму на госуслугах: http://www.gosuslugi.ru/pgu/eds
[11] через форму: http://zapret-info.gov.ru/tooperators/form/#form
[12] www.zapret-info.gov.ru/tooperators/: http://www.zapret-info.gov.ru/tooperators/
[13] suds: http://pypi.python.org/pypi/suds/0.4
[14] Источник: http://habrahabr.ru/post/158891/
Нажмите здесь для печати.