1с подключение к https
Привет Хабраюзер хочу поделиться своим недавним опытом интеграции двух различных систем.
Возникла задача о передаче данных между 1С (разработка и настройка была отдана на аутсорсинг), которую планируется использовать как основную систему электронного документооборота (ЭДО) и B2B системой (внутренняя разработка), которая написана на PHP (Symfony) и выполняет функции первичного ввода информации в компании.
У меня уже был опыт интеграции B2B с другой B2B. Суть заключалась к передаче JSONа при помощи cURL. Затем возникла задача интеграции системы «Borlas», основанная на Oracle, где также был применен данный подход. На стороне Oracle, правда, использовался свой пакет — аналог cURL в PHP (если будет интересно, могу описать в новой статье).
Как я выяснил, 1С 8.2 тоже умеет посылать GET и POST запросы. Предположил, что если уже все настроено и работает с другими системами, значит, и тут должно сработать. JSON отвергли разработчики 1С, сказав, что формат неподходящий и они признают только XML. Комментарии о том, что это нам даст минимум в размере при передаче данных, а данных действительно получалось очень много, были отвергнуты. В итоге приступили в подготовке 2 систем на основе XML.
Cо своей стороны я написал приемщик запросов из 1С и возврат результатов. Функция по приему переменной в POST, в которой 1Сники должны были подставлять XML.
Формат примерно следующий:
обработчик, который возвращает уже отобранные по условиям записи и формирует XML вида:
На первый взгляд, кажется, что все просто, но в процессе возникло несколько проблем:
1) аутсорсеры сообщили, что малознакомы с запросами такого рода, и попытались предложить старую проверенную схему:
1. импорт файла из B2B,
2. Загрузка в 1С,
3. Экспорт файла с указанием, что смогли обработать, что нет из 1С,
4. Импорт в Б2Б,
5. и с самого начала…
Схему отвергли, так как нужно быстро, и без участия человека и всяких «кнопочек».
Тогда попросили пример кода. В интернете я «нагуглил» следующий пример:
На сервер стали приходить данные, но пустые, то есть GET и POST были пустые. Я добавил запись что приходит в логи и успешно забыл об этом. Спустя 4 месяца мне была поставлена срочная задача — довести интеграцию до результата (так как прошло много времени, разработчики 1С работают, работают, но в ответ ничего не приходит). Мне поставили 1С и я начал «ковыряться».
В итоге это «Иначе» было выкинуто, и получил ошибку, что некорректный сертификат. Сертификат был само подписной. Разработка интеграции велась на внутренних серверах, где официально купленного сертификата от «Thawte SSL CA» в отличии от PROD сервера. Импорт сертификата во все возможные хранилища не привел к результату.
Поиск по ресурсам привел к тому, что все сертификаты корневые у 1С свои, и на основе них она уже проверяет остальные. Они лежат в тестовом виде в файле «cacert.pem», который расположен в папке «bin», где стоит 1С. Импорт, не так прост, как оказалось.
Для начала надо экспортировать нужный нам сертификат в файл (он у меня уже был в личном хранилище). Запустив «certmgr.msc», найдя сертификат, делаем его экспорт в файл *.cer.
Далее качаем программку Win32OpenSSL и преобразовываем его в тестовый вид.
У меня это получилось так:
MD5 сохраняем, он нам понадобится.
Далее открываем файл «cacert.pem».
Спускаемся в самый низ и добавляем сперва MD5, а потом все содержимое, что получилось в файле «fiddler.pem».
Сохраняем файл.
Перезапускаем 1С (возможно и не надо, но у меня не заработало, поэтому я перезапустил все.
Исходный файл в 1С был приведен в такой вид:
Готов поделиться информацией о злоключениях с настройкой Oracle и B2B.
Там использовался тот же механизм, передача данных в POST запросе, но были свои подводные камни. В принципе, там оказалось все проще.
Если пользователю будет необходим нетиповой обмен между базами и публикация баз будет возможна (установлен WEB-сервер), то можно воспользоваться механизмом WEB-сервисов.
Определение WEB-сервиса — реализация абсолютно четких интерфейсов обмена данными между различными приложениями, которые написаны не только на разных языках, но и распределены на разных узлах сети. Но в нашем примере мы разберем обмен между двумя базами 1С.
В базе-источнике требуется создать объект конфигурации: WEB-сервисы
В базе приемнике создаем объект конфигурации: WS-ссылки
WS-ссылка содержит описание WEB-сервиса из базы-источника. Этот объект конфигурации не имеет программного кода и представляет собой только модель данных и описание операций созданного в базе-источнике WEB-сервиса.
Пример описания WS-ссылки (рис.1)
Рис. 1 – описание WS-ссылки
Важным параметром является то, что данную ссылку мы можем открыть в браузере и посмотреть текстовое описание WEB-сервиса (рис.2). Если в браузере WEB-сервис не открывается, то и созданная WS-ссылка работать не будет
Рис. 2 – описание WEB-сервиса
Если мы откроем WS-ссылку, которая корректно загружена, то увидим вот такую картину (рис.3)
Пакеты, которые автоматически подключаются (ветка пакеты)
Сам WEB-сервис, к которому идет обращение и его операции, которые описаны в базе-источнике.
Операции WEB-сервиса описываются функциями встроенного языка. То есть – любая операция веб-сервиса должна возвратить какое-либо значение. Тип возвращаемого значения можно указать в описании операции WEB_сервиса (рис 4.2).
Типы возвращаемых значений мы указываем в свойстве непосредственно WEB-сервиса «Пакеты XDTO». Механизм XDTO позволяет определять объекты переноса данных, которые могут образовывать строгую иерархию и могут сериализоваться в XML. Эти свойства позволили использовать объекты XDTO в качестве параметров и возвращаемых значений операций web-сервисов.
Рис. 4.1 – описание WEB-сервиса
Рис. 4.2 – описание операции WEB-сервиса
После того, как мы описали функцию WEB-сервиса, которая будет вызываться из базы-приемника (в задаче: база приемник инициализирует обращение к базе-источнику, но этот механизм можно построить и наоборот, что база-источник будет отдавать данные в базу-приемник, тогда нам следует описывать WEB-сервис в базе-приемнике, а в базе-источнике будет WS-ссылка на него. Все зависит от конкретной задачи)
Описание вызова WEB-сервиса (Листинг 1)
Указать сертификат ssl
Организовать обращение к WS-ссылке с использованием метода: СоздатьWSПрокси – в методе прописывается
URL-пространство имен, (*) – описывается в Web-сервисе (см. рис 4.1),
имя сервиса (*)– описывается в Web-сервисе (см. рис 4.1),
имя порта (*) – описывается в WS-ссылке, см
использование аутентификации WINDOWS
Описание создания защищенного ssl-соединения (синтаксис-помощник 1С; листинг 2)
Листинг 2 - Возможные описания объекта защищенного соединения OpenSSL (1С помощник)
Объект защищенного соединения OpenSSL.
Используемый клиентский сертификат должен быть самоподписанным или проходить валидацию через сертификаты удостоверяющих центров, заданные в свойстве "СертификатыУдостоверяющихЦентров"
Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Листинг 2 – описание возможных описаний объекта защищенного соединения OpenSSL
Выбор корректного описания зависит напрямую от того, с каким сертификатом работает организация.
Если все корректно, то в переменную «ответ» (листинг 3) вернется значение из базы-источника. Так же тут указываем сразу параметры, которые требуются для передачи в операцию WEB-сервиса
Листинг 3 – Строка обращения к операции WEB-сервиса
Обрабатываем полученные результаты. И тут может быть два варианта.
Мы получили сразу объект того типа, который указывали в выходных параметрах. Нам его нужно просто обработать средствами встроенного языка – извлечь из него требуемые данные (если это таблица значений, структура или хранилище значений, как в нашем случае).
WEB-сервер нам возвращает закодированный ответ в виде строки BASE64. Этот случай опишем подробнее.
Если WEB-сервер нам возвратил закодированную строчку, то требуется выполнить преобразование ее в объекты 1С. Для этого нам следует сделать несколько преобразований:
BASE64 в двоичные данные (используем функцию встроенного языка 1С:
ДвоичныеДанные = Base64Значение(Ответ); (где ответ – это значение, которое возвращено WEB-сервером)
Используем фабрику XDTO для представления двоичных данных в объекте 1С (листинг 4)
Фабрика типов XDTO: Содержит определения всех типов, позволяет осуществлять чтения/запись данных XDTO в XML и JSON (материал Синтаксис-помощника).
Листинг 4 – использование фабрики XDTO для преобразования двоичных данных в объект 1С -
Создаем значение XDTO по лексическому представлению значения. Лексическое представление значения должно удовлетворять ограничениям, определяемым данным типом значения XDTO. Тип нашего XDTO (параметр 1 – является обязательным) должен совпадать с типом выходного параметра функции WEB-сервиса (см. Рис 4.2). Описываем пространство имен (URIПространстваИмен (NamespaceURI)) и БазовыйТип (BaseType). Вторым параметром в функцию подставляем наши двоичные данные (без преобразования их в объекты). Если все выполнено корректно, то наше выходное значение из WEB-сервиса будет содержаться в реквизите: телоXDTO.Значение, того типа, который мы указали в выходном параметре ("ValueStorage" – хранилище значения).
Работа непосредственно с получением данных через WEB-сервис на этом заканчивается.
Использование веб-сервисов 1С при обмене 1С – 1С позволяет быстро передавать достаточно большие объемы данных из базы-источника в базу-приемник в объектах языка 1С.
Данный метод обмена может применяться при бесшовной интеграции между двумя базами 1С, но требует определенной серверной инфраструктуры (установленного и настроенного WEB-сервера).
Так же этот вариант применим при необходимости получать данные из одной базы в другую (пример – получение остатка бюджета из одной базы (источник) при заведении нового счета на оплату (в сторонней базе)).
Для данного примера я работал с Платформой 1С 8.3.13.1865, конфигурацией Розница 2.2.12. Стандартный IIS сервер 8.5.
Решение этой задачи я разобью на 2 этапа: подготовительный и основной.
Здесь я не буду расписывать, как опубликовать базу в веб, благо подобной информации очень много.
Итак, подготовительный этап:
1.1. Для начала мы должны привязать доменное имя к вашему ip адресу:
Без доменного имени, привязать SSL сертификат НЕЛЬЗЯ, поэтому, заходим на регистратора доменных имен и покупаем любое свободное имя.
Далее, заходим в "Управление доменной зоной" в личном кабинете регистратора доменного имени и делаем 2 записи типа А (для www и без - см.рис), куда прописываем ваш внешний ip (опубликованная база должна быть доступна по этому ip заранее).
Тут все просто, проверяем доступность базы по подключенному имени, через некоторое время. Через немного времени, убедимся, что все хорошо.
1.2. Пробросим порт 443 на роутере:
на рисунке у меня проброшены следующие порты:
3340 - соединение к удаленному рабочему столу (к описанию отношения не имеет, но оставлю для пояснения)
1.3. Настройка IIS
Сделаем привязку имени узла к основному сайту в IIS. Для этого, заходим в Диспетчер IIS (см. рис):
Выбираем в раскрывающемся списке Default Web Site и прописываем для него Привязки. В имя узла пропишем наше доменное имя.
На этом подготовительный этап закончен, переходим к основному:
2.1. Создание и запись сертификата Let's encrypt.
Для этого, я воспользовался свободной программкой letsencrypt-win-simple.V1.9.3.zip (приложена к этой инструкции).
Запускаю программу от имени администратора и делаю следующие действия:
Вводим электронную почту.
На данный вопрос вводим "y".
Далее, программа находит DNS записи на сервере IIS. Выбираем нашу запись - нажимаем "1".
На следующий (последний) вопрос вводим "N"
Сертификат создан и записан в IIS.
2.2. Проверяем установленный сертификат
Для этого открываем Диспетчер служб IIS и в разделе "Сертификаты сервера" смотрим наш сертификат.
Теперь, наша база опубликована по доменному имени и работает по защищенному соединению.
Всем спасибо за прочтение, буду рад, если данный материал Вам поможет!
Ранее опубликованные материалы
Так же, прошу посмотреть мои предыдущие статьи:
Специальные предложения
Вот еще бы как бы с Апачем это сделать и прикрутить сертификаты к сервису no-ip Я так понял если у нас белый статический ip, а домена нет, то ничего не выйдет?
Тоже самое если я допустил развернул веб-сервер у себя в локальной сети, доменного имени нет, есть только имя ПК, тоже пшик или есть варианты?
(2) вариант- купить доменное имя. Ssl сертификаты выдаются только на доменные имена..
если честно не заморачивался локальной сетью - мне нужно было установить именно защищенное соединение с вебсервисом
(22) ну это для первого варианта подходит, а для локальной сети для поиграться? Удивительно - раздавать за "см" не своё, так еще и старьё.Github - проект win-acme MSK_Step; GODART; Lyolik; igee12; mitia.mackarevich; A_Max; ltfriend; iliabvf; Fox-trot; ziercool; 3vs; + 11 – Ответить Let's encrypt - прикольная штука. Как раз недавно у одного сайта закончился покупной 3х годовалый сертификат, решили не продлевать, а воспользоваться Let's encrypt. Он ежемесячно перевыпускает новый SSL сертификат. Практически все этот сертификат признают. Только мы не предложенной в статье консольной утилитой пользовались, а гуишным (визуальным) приложением. Там мастерок вполне не сложный помогает пройти нужные этапы. Приложение монтируется как сервис и занимается генерацией сертификатов и привязкой его к сайту без Вас. (5) посмотрела повнимательней статью. самое главное, что забыл сказать автор , упоминая Let's encrypt, это как раз то, о чем выше написала - что его достаточно один раз настроить и про просрочку SSL-сертификатов можно забыть , сервис сам ежемесячно следит за перевыпуском сертификата (т.е. он никогда не просрочится).
А то из статьи получается, что нужно делать сертификат на 3 месяца каждый раз ручками. ну это так, замечание :) (6) совершенно верно, сертификат получается на 3 месяца, что указано мной. Ну все остальное - на развитие темы конечно! (8) да, Вы молодец - что упомянули эту тему, т.к. многие про этот функционал не знают. Мое дополнение лишь для того, чтобы те кто зайдут почитать понимали зачем вообще заморачиваться с этим сервисом (ведь ради трех месяцев этим заниматься не охота, а вот чтобы забыть о проблеме почти навсегда - уже стоит подумать. ) (6) Ну да, при одном условии.
хттп порт (по-умолчанию 80) должен быть в момент "перевыпуска" открыт на веб-сервере, что есть очень плохой затеей. Поэтому для автоматического "перевыпуска" лучше ограничить запросы по хттп. (26) насколько знаю - это только при первой генерации, дальше уже не нужно. (27) Я тоже так думал. Однако каждый раз у меня "ругается" на недоступность из вне http ://имя_домена/.well-known/acme-challenge.
Причём это и IIS, и apache/nginx.
Может "руки"?) (5)А вы не поделитесь ссылочкой на это приложение гуишное для перевыпуска сертификатов? (9) Описание проектов - доходите до заголовка "Windows / IIS" и ищите там в тексте "GUI"
Полученные ссылки оттуда на страницы скачивания 2-х проектов GUI:
GetCert
Certify SSL Manager (5) А там не сложно перевыпускать ключи? Это через приложение делается? (7) У меня как раз 1С на поддоменах, в управлении ДНС домена создал А-записи для поддомена с указанием ip.. При этом Let's encrypt умеет wild-сертификаты - т.е. я получаю один сертификат, где прописаны мои поддомены (2шт). Может кто знает коллеги, как бы ssl к сервису no-ip прикрутить? Не у всех белый, статический ip есть. (15)В том и проблема. С пробросом портов нет вопросов. Но прикрутить серт к субдомену no-ip это оказалось той еще историей. Кто то пишет что вообще не возможно.
1. Скрипт запустить от имени администратора и Ввести "M" - full options (рисунок 2). В простом режиме "N" получал ошибку прохождения аутентификации.
2. Ввести "2" - single binding
3. Ввести цифру сайта из найденных
4. Можно написать свое имя или просто нажать enter
Следующие рекомендуемые шаги подсвечены зеленым - скриншот не стал до конца делать.
По итогу получил сертификат для сайта на динамическом ip. Скрипт также создает задание в планировщике на обновление сертификата.
Ты забыл что уязвимость определяется по самому тонкому месту, где отключение 80 порта? (19) разумеется. отключите 80 порт или сделайте переадресацию на 443 А можно это все в докер обернуть и как переносимый сервис организовать? (21) Можно. Только вазелин закупите, он ва м пригодится, когда докер сломается и убьет базу. Теперь, наша база опубликована по доменному имени и работает по защищенному соединению.Читаем: "Торчит попкой наружу". Да, соединение шифрованное. Но теперь Главбух Маша с полными правами и паролем "12345" неожиданно начнёт работать из Китая, Швейцарии или Перу.
Торча наружу было бы здорово озаботиться ещё парой штук:
1. Клиентские сертификаты - 1С в них умеет
2. Не привязывать доменное имя непосредственно к внешнему IP-адресу своих серверов - только прослойка.
Общеизвестные и много где описанные шаги тезисно:
1. Из конфигуратора на выбранном сервере создаём хранилище конфигурации, создаём пользователя Windows, даём ему необходимые (все) разрешения на каталог хранилища
2. создаём сервер "crserver.exe -instsrvc -d [каталог хранилища] -usr [пользователь Windows] -pwd [пароль]" и пробуем подключиться к нему из 1С по адресу
tcp://[имя или IP сервера]/[подкаталог если есть].
Утилита crserver лежит в каталоге x86: "C:\Program files\1cv8\[номер версии конфигурации]\bin\"
x64: "C:\Program files\1cv8 (x86)\[номер версии конфигурации]\bin\"
3. устанавливаем IIS
4. в корневом каталоге (по умолчанию C:\inetpub\wwwroot) создаём подкаталог (например REPO) и в нем создаём текстовый файл (например REPO.cr) следующего содержания
5.Заходим в IIS Manager находим созданный каталог и конвертируем его в приложение (правой кнопкой Convert to application) заходим в него и добавляем обработчик 1С в Handler mappings (правая кнопка - add script map. Path = *; Executable = "C:\Program Files\1cv8\[номер версии конфигурации]\bin\wsisapi.dll";name = "1C Web-service Extension"). Если сервер x64 а 1с используете x86 то соответственно изменится путь к dll и в advanced settings вашего application pool надо поставить разрешение использовать 32 битные приложения
- Импортировать сертификат сервера в локальный компьютер - доверенные центры сертификации (local computer - central root certificate authoriities)
далее если система "не знает" центр сертификации выдавший этот сертификат, необходимо так же:
- импортировать сертификат удостоверяющего центра в хранилище сертификатов локального компьютера - доверенные центры сертификации
для конвертации можно написать скрипт следующего содержания (прилагается)
Далее содержимое PEM файла добавляем к файлу
C:\Program Files\1cv8\[Номер версии конфигурации]\bin\cacert.pem
C:\Program Files (x86)\1cv8\[Номер версии конфигурации]\bin\cacert.pem
ps. так же крайне необходимо следить чтобы имя сервера IIS которое используется для подключения к хранилища точно совпадало с именем на которое выдан сертификат (в случае расхождений самый простой вариант - внести правки в файл hosts (C:\Windows\System32\drivers\etc\hosts) чтобы IP IIS соответствовало имя из сертификата.
Например, имеется внутренняя сеть организации, в которой развернуто окружение разработки, есть несколько серверов и запущен сервер отладки. Разработка и отладка внутри сети выполняется постоянно, и возникающие ошибки исправляются оперативно. Помимо этого продуктивный контур этой организации находится во внешней сети и подключение к основному серверу реализовано с помощью защищенного подключения к веб серверу. Кроме открытого порта 443 доступ к внутренней сети отсутствует. Для того, чтобы выполнить отладку сотруднику приходится просить воспроизведения сценария, либо подключаться удаленно для того, чтобы составить сценарий самостоятельно. Возможности отладки напрямую в такой ситуации отсутствуют.
Решением таких проблем является настройка и перенаправление запросов отладки через соединение с веб сервером, либо использование агента 1С:Link (при условии, что используется данная технология). Ниже представлены примеры настройки перенаправления запросов к серверу отладки для веб серверов Nginx и IIS , а также подключение к серверу отладки с помощью агента 1С:Link .
2. 1С:Линк
При установке агента 1C:Link и публикации сервера, на компьютере на котором расположен сам агент открывается дополнительный тунель для порта 1550 .Канал работает только для локального адреса, без возможности указания порта сервера отладки. Тунель открывается и слушает порт в не зависимости от того, запущен сервер отладки или нет.
1C:Enterprise 8.3 Debug Server (8.3.17.1091) © 1C-Soft LLC 1996-2019 - it works!
Настройка удаленного подключения к опубликованному серверу отладки
Настройка выполняется в конфигураторе в меню " Сервис " > " Параметры ", вкладка "Отладка":
Примените изменения и перезапустите конфигуратор.
Для проверки работоспособности сервера, откройте окно подключения предметов отладки (меню " Отладка " > " Подключение "):
Если при перезапуске конфигуратора возникла ошибка , то необходимо проверить доступность сервера и публикации, с того компьютера, на котором запущен конфигуратор.
Для подключения клиента 1С:Предприятия для отладки, необходимо в параметрах запущенного приложения (" Файл " > " Настройки ") разрешить отладку в текущем сеансе и указать сервер отладки :
После этого подключить необходимый клиент для отладки в конфигураторе.
3. Настройка веб сервера
Предполагается, что сервер отладки запущен на внутреннем сервере и работает на порту 1550 . В качестве имени внутреннего сервера, для примера, является internal. server.01 . Адрес веб сервера external. server.02. Имя ресурса debugger может быть произвольным и используется в качестве примера.
3.1. Nginx
Для того, чтобы можно перенаправлять запросы к северу отладки через Nginx , необходимо добавить в настройки описания доступных ресурсов веб сервера (конфигурационные файлы в sites-available ) следующее правило расположения в секции server:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
После настройки конфигурационного файла убедиться, что команда nginx –t не возвращает информацию об ошибках.
1C:Enterprise 8.3 Debug Server (8.3.17.1091) © 1C-Soft LLC 1996-2019 - it works!
3.2. Настройка сервера IIS
Для того, чтобы IIS умел перенаправлять запросы, необходимо установить дополнительно компоненты « URL Rewrite » и « Application Request Routing ». Это можно сделать либо с помощью Web Platform Installer , либо вручную по следующим ссылкам:
После установки в консоли управления IIS для публикации сайта появится новый пункт меню:
Необходимо нажать на новый пункт меню и в открывшемся окне нажать кнопку «Добавить правила».
Откроется окно, в котором укажите адрес внутреннего сервера отладки (internal.server01:1550) и нажмите ОК .
Правило будет создано и его нужно будет открыть из списка правил для дополнительной настройки.
В окне настроек правила укажите следующие параметры:
Для завершения настройки осталось добавить правило перенаправления с порта 443 источника и нажать кнопку « Применить »:
После применения правила перезапустите сервер IIS .
Способ проверки работоспособности перенаправления запросов в сервер отладки, такой же как и при настройке Nginx.
4. Ссылки
1С:Предприятие. Документация :: Глава 32. Отладка и тестирование прикладных решений
Читайте также: