Подключение к HTTP-сервису с авторизацией посредством передачи клиентского SSL-сертификата

21.01.23

Интеграция - WEB-интеграция

В статье хочу поделиться опытом настройки подключения 1С к стороннему HTTP-сервису, использующему авторизацию посредством передачи клиентского SSL-сертификата.

Добрый день! В сети не нашел подробных и работающих примеров, как из 1С организовать подключение к внешнему API, передавая клиентский сертификат для авторизации, надеюсь, что данная статья будет полезна для сообщества.

Все началось с того, что необходимо было написать интеграцию 1С со сторонним http-сервисом одной крупной финансовой организации. Для авторизации на этот HTTP-сервис необходимо передавать клиентский сертификат, который будет создан и передан нам этой организацией-владельцем сервиса.

Чтобы получить сертификат, мы должны были сгенерировать csr-запрос на создание сертификата и отправить этот запрос владельцам сервиса, они на основании этого запроса сделают для нас сертификат. Для генерации csr-запроса мы использовали онлайн CSR-генератор. После того как мы заполнили все поля в онлайн-генераторе и нажали кнопку «Сгенерировать CSR», нам на почту прислали письмо, содержащее:

1. CSR-запрос на выдачу SSL-сертификата

 

-----BEGIN CERTIFICATE REQUEST-----
EIICyDCCAbACAQAwgYIxCzAJBgNVBAYTAlJVMQ8wDQYDVQQIDAZNb3Njb3cxDzA

…
-----END CERTIFICATE REQUEST-----

 

2. Приватный 2048-битный RSA-ключ

 

-----BEGIN PRIVATE KEY-----
IBAQCylzPeegLeaDef
U9jnGSnV+iso58Y7JgfeHKLYntwynPJK5BDlrsVhu8IznAX7JpfMrVAu0VvMfeEX

…
-----END PRIVATE KEY-----

 

CSR-запрос мы отправили владельцам сервиса, а RSA-ключ сохранили в текстовый файл, созданный в блокноте, с расширением pem, этот файл назвали key.pem, он понадобится нам позже.

На основе CSR-запроса организация-владелец сервиса сделала и прислала нам сертификат. Это был файл в формате cer.

 

 

Теперь настало время 1С-разработчика. Необходимо было написать код по подключению из 1С к HTTP-сервису.

Сначала подключение было протестировано через утилиты CURL и Postman. Оказалось, что обе утилиты не умеют работать с сертификатами в формате cer. С помощью утилиты OpenSSL пришлось конвертировать сертификат в формат pem, для этого файл cert.cer был помещен в каталог с установленной утилитой OpenSSL и в командной строке Windows выполнены команды:

 

cd "C:\Program Files\OpenSSL\bin\"

openssl x509 -inform der -in cert.cer -out cert.pem

 

В результате выполнения команды был создан файл cert.pem.

Приведу строку подключения для утилиты CURL, которая в итоге у нас заработала:

 

C:\curl\bin\curl.exe -v --get -k -u user:password --header "User Agent:cURL" --cert "C:\Program Files\OpenSSL\bin\cert.pem" --key "C:\Program Files\OpenSSL\bin\key.pem" https://адрес_сервиса

 

После того как удалось подключиться через CURL и Postman, необходимо было научить 1С отправлять такой же запрос. Поковырявшись в синтакс-помощнике, я так и не понял, как прикрутить к http-запросу приватный ключ (файл key.pem). Но в итоге с помощью утилиты OpenSSL я объединил файлы cert.pem и key.pem в один файл cert.p12, только после этого мне удалось подключиться к HTTP-сервису из 1С.

Командная строка по конвертации сертификата в формат p12:

 

cd "C:\Program Files\OpenSSL\bin\"

openssl pkcs12 -export –out cert.p12 -inkey key.pem -in cert.pem

 

После выполнения этой команды в командной строке дважды нужно будет ввести пароль на создаваемый сертификат, этот пароль потом нужно будет указывать при создании http-соединения в 1С (предположим, что я указал пароль 654321). В результате выполнения команды был создан файл cert.p12.

Вот такой код на встроенном языке 1С у меня в итоге заработал:

 

SSL = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаФайл("C:\Program Files\OpenSSL\bin\cert.p12", "654321"));

Соединение = Новый HTTPСоединение(Сервер,, ИмяПользователя, Пароль,, 60, SSL, Ложь); // Адрес сервера должен быть без https://.

 

клиентский сертификат SSL http-соединение http-запрос cer key pem p12 crt OpenSSL curl авторизация

См. также

Оптовая торговля Розничная торговля WEB-интеграция 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Онлайн-заказ - это решение для автоматизации процесса оформления заказов на сайте в торговых организациях. Продукт обеспечивает легкое взаимодействие между компанией и клиентами через веб-интерфейс, интегрированный с 1С:Предприятие. Система позволяет снизить операционные расходы, повысить лояльность клиентов и оптимизировать работу отдела продаж.

57600 руб.

26.11.2024    1235    1    1    

4

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    18354    20    22    

18

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс 24. Разработка имеет двухстороннюю синхронизацию 1С и Bitrix24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23): 1С:Управление торговлей, 1С:Управление Нашей фирмой 3, 1С:Комплексная автоматизация 2, Объединенное решение: Модуль 1С:CRM 3 (3.0.21.3) +1С:ERP Управление предприятием 2. При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

7200 руб.

04.05.2021    20564    13    19    

18

WEB-интеграция Программист Бизнес-аналитик Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

14400 руб.

20.12.2024    320    2    0    

5

WEB-интеграция Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    2477    1    0    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. BaphoBush 6 07.12.21 18:43 Сейчас в теме
Эх, тоже думал написать, но никак руки не дошли.
2. Dragonim 142 08.12.21 06:56 Сейчас в теме
В первый раз вижу сервис который присылает на почту приватный ключ. Не пользуйтесь подобными сервисами. Приватный ключ должен генерироваться там где он будет использоваться. Любая передача или копирование приватного ключа это повод занести его в черный список.
JohnyDeath; Dach; BaphoBush; +3 Ответить
3. kholkin 211 08.12.21 07:09 Сейчас в теме
(2) да, csr-запрос и приватный ключ можно сгенерировать утилитой OpenSSL, что и было сделано для рабочего контура интеграции. То, что сгенерировали онлайн-генератором, используется на тестовом контуре.
SG_acc; edkuznetsov; a-rro-vv; +3 Ответить
4. Офелия 08.12.21 10:55 Сейчас в теме
у нас похожая задача, для интеграции с одним немаленьким банком)) движ нужен для OpenSSL специальный по ГОСТ 34.10-94
$ openssl genpkey -out private.pem -engine gost -algorithm gost2001 -pkeyopt paramset:A
engine "gost" set.
не делали такое в винде?
5. kholkin 211 08.12.21 11:07 Сейчас в теме
6. Офелия 08.12.21 11:22 Сейчас в теме
(5) жаль. спасибо за публикацию!
7. a-rro-vv 08.12.21 12:26 Сейчас в теме
Спасибо за публикацию! Полезная статья
8. пользователь 09.12.21 11:28
Сообщение было скрыто модератором.
...
9. JohnyDeath 302 10.12.21 22:13 Сейчас в теме
11. Офелия 20.01.22 15:26 Сейчас в теме
(10) спасибо огромное! Поизучаю на днях с пристрастием :)
// задачка эта так и подвисла у меня. Банк отморозился от объяснений "у нас есть те, кто сделал интеграцию"... , а сама я не продвинулась в этой теме
12. Lionlan 09.02.22 23:39 Сейчас в теме
(11) Это не АБР случайно? :)
13. psa247 21 09.06.22 17:09 Сейчас в теме
Спасибо за статью. В моем ТЗ требовалось еще использовать токен. В итоге получилось:

Токен = "1111111111-dbf3-11ec-9e2a-e43d1aa11a9b";
Заголовки = новый Соответствие();
    Заголовки.Вставить("Agreement-Token", Токен); 
    Заголовки.Вставить("Authorization", "Basic 566565655669C20LXQsdC90YvQuVdNUzo5ODI1"); 
	
    Заголовки.Вставить("Content-Type","application/json");
    
    SSL_Соединение=Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаФайл("E:\cert.pem", ""));
    HttpСоединение=новый HttpСоединение("тут адрес сервера",,,,,,SSL_Соединение, ЛОЖЬ);
    Сервис="/api/category";
        
    HTTPЗапрос = новый HttpЗапрос(сервис, заголовки);
    ответ = новый структура;
    HttpОтвет = HTTPСоединение.Получить(HTTPЗапрос);
    
    Результат = HttpОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);	
	Сообщить(Результат);
Показать
kvvprog1s; d4rkmesa; +2 Ответить
14. wmonref1 18.06.23 18:47 Сейчас в теме
Никак не удается осуществить подключение. Получил сертификат в формате .p12 от владельца сайта. Установил для локального пользователя и для локальной машины и для пользователя USR1CV8. Создал .pem файл с ключами из того же cert.p12 (через openssl). Если использовать

ССЛ = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаФайл("e:/!work/cert.p12", "123456"), Новый СертификатыУдостоверяющихЦентровФайл("e:/!work/cert.pem"));


получаю "Ошибка работы с Интернет: Удаленный узел не прошел проверку".


Если использовать

ССЛ = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаФайл("e:/!work/cert.p12", "123456"));


получаю "400 The SSL certificate error"

Также пробовал разные варианты для Новый ЗащищенноеСоединениеOpenSSL() , но результат один и тот же "400 The SSL certificate error". В документации АПИ написано что используется TLS Аутентификация с помощью Client Certificate Auth

Помогите пожалуйста разобраться.... Платформа 8.3.20.1710, обычные формы, клиент-сервер
15. tps_01 64 06.07.23 16:42 Сейчас в теме
Автор, спасибо за статью, ибо только так удалось путем конвертации в .p12 + пароль подключиться к банку.
Однако, сейчас в документации банка обнаружил еще один вариант (проверил, работает. Пароль не нужен)

Что бы работало, нужно объединить файлы cert.pem и private.key в один файл. например cert-and-key.pem.
Нужно взять содержимое сначала .pem потом .key. Пример итогового cert-and-key.pem

-----BEGIN CERTIFICATE-----
Содержание сертификата
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
Содержание ключа
-----END PRIVATE KEY-----

Далее
ССЛ = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаФайл("/path/to/serts/k/cert-and-key.pem"));
user1232941; +1 Ответить
16. tps_01 64 06.07.23 16:47 Сейчас в теме
(14)
Пробуйте в качестве цепочки указать СертификатыУдостоверяющихЦентровWindows().
Установите промежуточные сертификаты (удостоверяющие цепочки) для компьютера целиком (не для пользователя).
Проверить доступность файла "e:/!work/cert.p12" из того места, откуда вызывается метод HTTP (с сервера или клиента)
17. wmonref1 08.07.23 15:18 Сейчас в теме
(16)Спасибо. Решил свою проблему через WinHttpRequest
Оставьте свое сообщение