В ЛК заявку на подключение давали, тестовые методы на логин подключили.
Пробую подключаться, код выполняется в файловой базе, то есть на клиенте, обычное приложение:
Попытка
ЗащищенноеСоед = Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Авто),
Новый СертификатыУдостоверяющихЦентровWindows());
Соединение = Новый HTTPСоединение("portal.fedsfm.ru", , , , , , ЗащищенноеСоед);
Исключение
ТекстОш = ОписаниеОшибки();
Сообщить("Не получилось установить соединение:" + Символы.ПС + ТекстОш);
Возврат;
КонецПопытки;
СтруктураЗапроса = Новый Структура;
СтруктураЗапроса.Вставить("userName", "ХХХ");
СтруктураЗапроса.Вставить("password", "ХХХ");
ТелоЗапроса = ПолучитьJSONИзСтруктуры(СтруктураЗапроса);
ОтветСервера = Неопределено;
ИмяФайлаОтвета = ПолучитьИмяВременногоФайла();
ИмяФайлаЗапроса = ПолучитьИмяВременногоФайла();
ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаЗапроса);
ЗаписьТекста.Записать(ТелоЗапроса);
ЗаписьТекста.Закрыть();
ХТЗаголовки = Новый Соответствие;
ХТЗаголовки.Вставить("Content-Type", "application/json");
Попытка
ХТЗапрос = Новый HTTPЗапрос("/services/fedsfm-service/test-contur/authenticate", ХТЗаголовки);
ХТЗапрос.УстановитьИмяФайлаТела(ИмяФайлаЗапроса);
Соединение.ОтправитьДляОбработки(ХТЗапрос, ИмяФайлаОтвета);
Исключение
ТекстОш = ОписаниеОшибки();
Сообщить("Не получилось отправить запрос:" + Символы.ПС + ТекстОш);
Возврат;
КонецПопытки;
ФайлОтвета = Новый Файл(ИмяФайлаОтвета);
Если ФайлОтвета.Существует() Тогда
ТекстОтвета = Новый ТекстовыйДокумент();
ТекстОтвета.Прочитать(ИмяФайлаОтвета);
Если ТекстОтвета.КоличествоСтрок()>0 Тогда
ТекстОтвета.Показать();
Иначе
Сообщить("Получение данных с сервера: Получен пустой ответ сервера.");
КонецЕсли;
Иначе
Сообщить("Получение данных с сервера: Ответ сервера не получен.");
КонецЕсли;
Попытка УдалитьФайлы(КаталогВременныхФайлов(), ИмяФайлаОтвета); Исключение КонецПопытки;
Попытка УдалитьФайлы(КаталогВременныхФайлов(), ИмяФайлаЗапроса); Исключение КонецПопытки;
Показать
Рабочее место настроено, в браузеое по сертификату захожу без проблем.
В ответ приходит 404 - файл не найден или перемещён.
Если указать порт 8081, то вообще отправка для обработки не работает: Ошибка работы с Интернет: Failure when receiving data from the peer
(1)Проблема решена. Суть в том что 1С в принципе не умеет в защищенное соединение по ГОСТ. Во всяком случае, заставить её так работать не получилось на платформе 8.3.22
Для установки соединения использована программа Stunnel от КриптоПРО - обязательно брать именно их сборку, стандартный STunnel так же в ГОСТ не умеет. Доступна на этой странице:
Stunnel Ставим его на машину, где настроено рабочее место РФМ, для пользователя от которого запускается служба должна быть доступна из хранилища вся цепочка сертификатов для РФМ от личного до Минцифры.
Настраиваем конфу, примерно так:
open.cer - это сертификат открытого ключа личного сертификата для доступа в ЛК РФМ.
Стартуем службу.
После этого, код в 1С будет выглядеть примерно так:
Соединение = Новый HTTPСоединение("127.0.0.1", 8383);
СтруктураЗапроса = Новый Структура;
СтруктураЗапроса.Вставить("userName", "ХХХ");
СтруктураЗапроса.Вставить("password", "ХХХ!");
ТелоЗапроса = ПолучитьJSONИзСтруктуры(СтруктураЗапроса);
ХТЗаголовки = Новый Соответствие;
ХТЗаголовки.Вставить("Content-Type", "application/json");
ХТЗапрос = Новый HTTPЗапрос("services/fedsfm-service/test-contur/authenticate", ХТЗаголовки);
ХТЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса);
Ответ = Соединение.ОтправитьДляОбработки(ХТЗапрос);
Показать
Здесь в ответе будет токен. А в последующих запросах этот токе надо вставлять в заголовок.
В инструкции у них сказано, что ключ заголовка должен быть «Authenticate» - это не правда, так не работает.
А вот так нормально:
(7)Подключение только по сертификату. Вопрос не в правильности кода, а что именно нужно сделать, чтобы подключиться к РФМ. Вопрос именно к людям, которые уже налаживали связь через РЕСТ АПИ к ним.
ТП от РФМ утверждает что у них всё ровно, значит у меня то то сделано не так, предполагаю, что вопрос настроек подключения, но что именно?
(11)
Смотрел, сертификаты пляшут нормально. Без них сразу отбойник по SSL
Пробовал сертификат как файл подключать в защищенное соединение - та же петрушка.
У меня пока два варианта:
1. Сертификат к запросу надо как то по другому подключать. В инструкции сказано:
При вызове любого метода сервиса для установления защищенного по ГОСТ https-соединения необходимо передавать сведения о сертификате инициатора запроса
Как это сделать иными способами кроме как через объект ЗащищенноеСоединениеOpenSSL я не знаю. Есть варианты?
2. В инструкции опечатка в методе или я не туда стучусь. Написано следующее:
Адрес https://portal.fedsfm.ru:8081/Services/fedsfm-service Метод Назначение
Код: test-contur/authenticate
Наименование: Авторизация Тестовый метод возвращает JSON Web Token (JWT-токен) сессии (авторизации)
(14)
Был там. Программа для банков. Покупать чтобы попробовать - такое себе...
Да и задача у меня - грузить списки в 1С, а значит всё равно из 1С подключение делать.
(1)Проблема решена. Суть в том что 1С в принципе не умеет в защищенное соединение по ГОСТ. Во всяком случае, заставить её так работать не получилось на платформе 8.3.22
Для установки соединения использована программа Stunnel от КриптоПРО - обязательно брать именно их сборку, стандартный STunnel так же в ГОСТ не умеет. Доступна на этой странице:
Stunnel Ставим его на машину, где настроено рабочее место РФМ, для пользователя от которого запускается служба должна быть доступна из хранилища вся цепочка сертификатов для РФМ от личного до Минцифры.
Настраиваем конфу, примерно так:
open.cer - это сертификат открытого ключа личного сертификата для доступа в ЛК РФМ.
Стартуем службу.
После этого, код в 1С будет выглядеть примерно так:
Соединение = Новый HTTPСоединение("127.0.0.1", 8383);
СтруктураЗапроса = Новый Структура;
СтруктураЗапроса.Вставить("userName", "ХХХ");
СтруктураЗапроса.Вставить("password", "ХХХ!");
ТелоЗапроса = ПолучитьJSONИзСтруктуры(СтруктураЗапроса);
ХТЗаголовки = Новый Соответствие;
ХТЗаголовки.Вставить("Content-Type", "application/json");
ХТЗапрос = Новый HTTPЗапрос("services/fedsfm-service/test-contur/authenticate", ХТЗаголовки);
ХТЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса);
Ответ = Соединение.ОтправитьДляОбработки(ХТЗапрос);
Показать
Здесь в ответе будет токен. А в последующих запросах этот токе надо вставлять в заголовок.
В инструкции у них сказано, что ключ заголовка должен быть «Authenticate» - это не правда, так не работает.
А вот так нормально:
У Вас какой в итоге получился конфиг (в частности уровень verify)? Возможно есть запись лога успешного соединения?
Какую версию stunnel-msspi используете?
(19) verify = 2.
Стуннель от Крипто про.
Как вариант, 403 - скорее всего, необходимые сертификаты ОС недоступны для пользователя от которого работает служба стуннель.
От имени этого пользователя откройте ЛК РФМ и попробуйте авторизоваться по сертификату. Как только это получится - должно и из 1С.
(18) В cacert.pem пробовали добавлять информацию о корневом сертификате сервиса, на который выполняется запрос (при его отсутствии)? Пробовали сохранить сертификат в файл и в ЗащищенноеСоединениеOpenSSL передавать путь к файлу сертификата? Писал интеграцию с http-сервисом с установкой защищенного соединения с использованием выданного клиентского сертификата - работал вариант с сохранением файла сертификата p12 во временный файл и передачей пути к нему в ЗащищенноеСоединениеOpenSSL. Но не помню, с каким алгоритмом шифрования выпускался сертификат...
Кроме того, что в доке некорректный заголовок для токена авторизации, так и дальше есть "неточности".
Я потерял время из-за собственной невнимательности и корявости доки на скачивании файла реестра экстремистов.
Дока приводит пример запроса:
{
"id": "9c...............................ed",
}
Т.е. JSON, что очевидно по оформлению.
НО! Если поднять глаза чуть выше, то там обнаружится требование к заголовку ContentType: application/x-www-form-urlencoded.
И вот это не вяжется никак. Параметры x-www-form-urlencoded передаются как Param1=xxxxxx&Param2=yyyyyy и т.д. Но никак не в JSON.
Пока не заметил этот нюанс и не упаковал в тело id=xxxxx вместо json варианта, получал ошибку 500.
Глобальный контекст.ПолучитьИмяВременногоФайла (Global context.GetTempFileName)
ПолучитьИмяВременногоФайла (GetTempFileName)
Доступен, начиная с версии 8.0.
Синтаксис:
ПолучитьИмяВременногоФайла(<Расширение>)
Параметры:
<Расширение> (необязательный)
Тип: Строка.
Указывает желаемое расширение имени временного файла. Если параметр не задан, то создается временный файл с расширением по умолчанию (.tmp). Желаемое расширение задается строкой, которая и будет использована в качестве расширения. Указание точки в начале расширения не обязательно. Например, при указании ".xml" или "xml" результат будет одинаковый.
Возвращаемое значение:
Тип: Строка.
Описание:
Для записи данных во временный файл необходимо сначала сформировать имя такого файла. При этом во избежание случайных потерь имеющихся файлов требуется получить уникальное имя. Данный метод предназначен для получения такого имени. При выполнении метода файл не создается. Если файл не будет удален средствами встроенного языка, он будет удален платформой при следующем запуске.
Дополнительно в клиент-серверном варианте:
файлы, созданные во время работы сеанса, будут удалены в течение 20 минут после завершения сеанса.
(недоступно в режиме совместимости 8.3.16 и ниже) файлы, созданные во время серверного вызова, будут удалены через 20 минут после завершения этого вызова.
Доступность:
Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Примечание:
Рекомендуется удалять временный файл самостоятельно после его использования, т.к. при активном создании файлов временные файлы могут занять значительную часть дискового пространства раньше, чем произойдет перезапуск платформы.
Данная рекомендация особенно актуальна для кода, исполняемого на сервере, так как регламент его эксплуатации может не предполагать регулярного перезапуска.
Доброго дня! Лень искать Не могу найти документацию по api для портала РФМ, не подскажете где почитать? Я правильно понимаю что функционал их api умеет только перечни скачивать?
Свежий где то на сайте РФМ. Я скачивал из личного кабинета - там раздел есть с документацией.
Лень искать. Давно этим проектом не занимаюсь - доступов уже нет, но вообще краем уха слышал, что вроде как норм сервис появился для проверки онлайн.