Содержание

Получение выгрузки РосКомНадзор средствами MikBiLL

Начиная с версии 2.7.13 в MikBiLL стал доступен модуль автоматического получения выгрузки.

Для его активации на время жизни консоли необходимо настроить файл конфига и запустить модуль через консольную команду.

Внимание! Модуль только ПОЛУЧАЕТ реестр запрещённых ресурсов, но НЕ блокирует их.
Если хотите, чтоб система запускалась с запуском сервера - добавьте в автозапуск. Для запуска на работающем сервере можете использовать at
С версии 2.7.16 стала доступна вторая версия выгрузки. Для этого в файле конфига выгрузки укажите:
version = 2.0
Если версия не указана, то будет приниматься, что указана вторая версия.

Для чего это надо

Надо это для того, чтоб не схлопотать штраф от РосКомНадзора за то, что не подчиняетесь закону РФ.

Как это работает

При запуске этого функционала (не забывайте добавить в автозапуск) в Вашей системе будет повешен демон, который будет, исходя из настроек конфига, отправлять запросы на сервер РКН для получения файла выгрузки.

После получения выгрузки, в папке, указанной в параметре конфига writableDir, будет создано 3 файла (при первой версии протокола):

, для второй версии протокола ещё будет создан файл:

Если convertToPunycode выключен, то файлы будут в кодировке UTF-8, если включен, то ASCII.
После активации convertToPunycode количество доменов может уменьшиться на несколько за счёт того, что в реестре он значится под обоими именами: кириллическим и в Punycode.

Эти файлы Вам уже нужно самостоятельно обрабатывать, чтоб Ваши пользователи не могли получить доступ к этим ресурсам.

Для первой версии: достаточно заблокировать по URL, чуть жёстче - сразу весь домен, и самый "не правильный" вид блокировки, но приемлемый, - по IP сервера. В зависимости от того, какой Вы вид выбрали Вы и будете использовать соответствующий файл: со списком URL, доменов или IP серверов.

Файл конфига

Он расположен по пути:
./mikbill/admin/app/etc/roskomnadzor/roskomnadzor.cfg

В первый раз все параметры, кроме необязательных, необходимо заполнить.

Таблица с описанием свойств файла:

Параметр Описание Комментарий
wsdlUrl адрес WSDL схемы Не изменяйте
version версия протокола В данный момент доступна первая (1.0) и вторая (2.0) версии
certPath абсолютный путь к сертификату Путь к сертификату, которым будет создаваться откреплённая электронная подпись к файлу запроса
writableDir директория доступная для записи В ней будут сохранены файлы выгрузки
openssl полный путь к openssl собранного с поддержкой алгоритмов ГОСТ
unzip путь к распаковщику Можно получить выполнив which unzip
execCommandAfterDownload команда применения выгрузки Рекомендуется записать все необходимые команды в .sh файл и указать путь к нему
timezoneOffset часовой пояс Укажите Ваш часовой пояс в формате '+06:00'
delayTime время между повторами на получение ответа выгрузки в минутах
lullTime время между актами получения выгрузок в минутах
данные оператора (Ваши данные)
operator название организации
inn ИНН
ogrn ОГРН
email e-mail
необязательные
systemEncoding язык системы Используется для записи логов и вывода в консоль в указанной кодировке. По умолчанию принимается кодировка UTF-8
debug параметр для отладки, принимает значения true/false При значении true делает вывод в консоль. Можете перенаправить его, куда Вам угодно
convertToPunycode Если включено ( = 1 ), то в файлы с доменами и URL будут генерироваться Punycode адреса. По умолчанию = 0
excludeDuplicates Если включено ( = 1 ), то будут удаляться дубли записей во всех листах: URL, domain, IP, SubnetIP По умолчанию = 1

Все параметры, кроме:

являются обязательными для заполнения.

Сохраняйте файл конфига в кодировке UTF-8.

Пример файл конфига (нажмите на названии, чтоб скачать):

roskomnadzor.cfg
# адрес WSDL схемы
wsdlUrl = http://vigruzki.rkn.gov.ru/services/OperatorRequest/?wsdl
# адрес тестовой WSDL схемы: для теста закоментируйте верхнюю строку символом "#" и раскоментируйте нижнюю строку
# wsdlUrl = http://vigruzki.rkn.gov.ru/services/OperatorRequestTest/?wsdl
 
# версия протокола, в данный момент доступна первая (1.0) и вторая (2.0) версии
version = 2.0
 
# абсолютный путь к сертификату
certPath = /root/cert.pem
 
# директория доступная для записи: указываем относительный путь, в конце адреса обязательно '/'
writableDir = ./app/etc/roskomnadzor/
 
# полный путь к openssl собранного с поддержкой алгоритмов ГОСТ
openssl = /usr/local/ssl/bin/openssl
 
# which unzip
unzip = /usr/bin/unzip
 
# команда применения выгрузки - команда, которую необходимо выполнить после получения и сохранения реестра запрещённых адресов
execCommandAfterDownload = 
# execCommandAfterDownload = /usr/bin/sudo -u root /var/www/mikbill/admin/sys/scripts/yourScript.sh
 
# часовой пояс
timezoneOffset = +06:00
 
# время между повторами на получение ответа выгрузки (минуты)
delayTime = 2
 
# время между актами получения выгрузок (минуты)
lullTime = 30
 
# [данные оператора]
# название
operator = ООО ""
# ИНН
inn = 123
# ОГРН
ogrn = 312
# e-mail
email = webmaster@localhost
 
# язык системы: указывайте только в случае, если он отличен от UTF-8, иначе - оставьте пустым: используется только для логов. Если укажите кодировку, то чтение логов станет невозможным из админки
systemEncoding = 
# Пример с указанной кодировкой:
# systemEncoding = koi8-r
 
# true - для отладки выводим все сообщения на экран, значения: true/false
debug = false
 
# преобразовывать в Punycode
convertToPunycode = 0
 
# исключаем дубликаты записей: url, domain, IP, SubnetIP
excludeDuplicates = 1

Настройка openSSL с ГОСТом для подписи запросов

Тут начинается самое "трудное и интересное".

Собрать openSSL с поддержкой алгоритмов ГОСТ: Установка и настройка OpenSSL-1.0.0
Думаю, что вполне можно собрать необходимую Вам версию openSSL.


# Правим файл /etc/openssl/openssl.cnf, а вернее тот, который находится в папке с нашим отдельным openssl
# Это пишем вверху:
openssl_conf = openssl_def

# Это – внизу:
[openssl_def]
engines = engine_section

[engine_section]
gost = gost_section

[gost_section]
engine_id = gost
dynamic_path = /usr/lib/openssl/engines/libgost.so
default_algorithms = ALL
CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet

dynamic_path = /usr/lib/openssl/engines/libgost.so - проверьте, чтоб по этому пути у Вас находился файл libgost.so, иначе - укажите другой путь.

Для проверки поддержки openssl алгоритмов ГОСТ выполним команду:
путь_к_openssl_с_ГОСТ ciphers | tr ":" "\n" | grep GOST

Результат должен быть следующим:
GOST2001-GOST89-GOST89
GOST94-GOST89-GOST89

OpenSSL с ГОСТом для Centos

Скачиваем и собираем исходник.

yum -y install imake
yum -y install zlib-devel
wget http://www.mikbill.ru/openssl-1.0.1f.tar.gz
tar xzf openssl-1.0.1f.tar.gz
cd openssl-1.0.1f
./config shared zlib enable-rfc3779 --prefix=/usr/local
make depend
make
make install
Внимательно смотрим после каждой комманды, чтобы не было ошибок. или же смотрим в гугл или думаем и ошибки устраняем.

Далее, после установки редактируем файл

mcedit /usr/local/ssl/openssl.cnf

До названия первой секции (первая строка [в квадратных скобках]) вносим:

openssl_conf = openssl_def

Далее в конец файла вносим:

[openssl_def]
engines = engine_section

[engine_section]
gost = gost_section

[gost_section]
engine_id = gost
default_algorithms = ALL
#dynamic_path = /usr/local/lib64/engines/libgost.so
#CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet

тестируем:

# /usr/local/bin/openssl ciphers | tr ":" "\n" | grep GOST

Вывод:

GOST2001-GOST89-GOST89
GOST94-GOST89-GOST89

Создание .pem файла для подписи запросов

Тут начинается самое "трудное и интересное".

Команда opensslGOST - это алиас на openssl, собранный с поддержкой алгоритмов ГОСТ.

export | grep PATH

подскажет Вам, куда можно положить симлинк на исполняемый файл.

Можно (нужно) указывать полный путь, например:
/gost-ssl/bin/openssl

Ключ необходимо экспортировать в формате PKCS#12 из криптоконтейнера в Windows с помощью утилиты P12FromGostCSP.

Файл PKCS#12 должен содержать сертификат и закрытый ключ! Проверить это можно командой:

opensslGOST pkcs12 -in p12.pfx -nodes


, где p12.pfx - файл, извлечённый с помощью P12FromGostCSP.

Вывод должен быть примерно таким (Windows) - нажмите для увеличения:

direct |

Далее преобразовать его в PEM. В OpenSSL это делается так (может запросить пароль, которым защищен Ключ PKCS#12):

opensslGOST pkcs12 -in p12.pfx -out key.pem -nodes -clcerts

Теперь у нас есть файл key.pem, к которому мы указываем полный путь в свойстве конфига "certPath".

Punycode

Punycode (произносится как «пуникод» или «пьюникод») — стандартизированный метод преобразования последовательностей Unicode-символов в так называемые ACE-последовательности (англ. ASCII Compatible Encoding — кодировка, совместимая с ASCII[1]), которые состоят только из алфавитно-цифровых символов, как это разрешено в доменных именах. Punycode был разработан для однозначного преобразования доменных имен в последовательность ASCII-символов. (https://ru.wikipedia.org/wiki/Punycode)

Если после установки в конфиге значения "конвертировать в punycode" получение выгрузки вылетает с ошибкой

PHP Fatal error:  Call to undefined function idn_to_ascii() in /var/www/mikbill/admin/index.php on line 0

, то проверьте, установлен ли модуль intl:

php -m | grep intl

Если нет, то необходимо его установить: http://php.net/manual/ru/intl.installation.php

Запуск

Запускается через консольную команду "runRosKomNadzorDaemon".

Пример запуска при нахождении в директории ./mikbill/admin/:

php ./index.php runRosKomNadzorDaemon
Рекомендуем запускать через утилиту at, которой указываем .sh скрипт для запуска.

Пример содержимого .sh скрипта для Linux систем:

cd /var/www/mikbill/admin/
php ./index.php runRosKomNadzorDaemon

Чтение логов РКН

Логи могут быть прочитаны непосредственно с файловой системы Вашим излюбленным текстовым редактором:
./mikbill/admin/app/log/roskomnadzor.log

Из админ. панели:
настройки → настройки обновлений → показать log Роскомнадзор

Внимание, если в настройках конфига модуля РКН указана кодировка отличная от UTF-8, то её необходимо указать в системных опциях:
услуги → "получение выгрузки РосКомНадзор" → кодировка
nolink&|

На странице частично используется материал из: http://habrahabr.ru/post/187574/ и других открытых источников.