Имя: Пароль:
1C
1С v8
Подключение по API к сайту с SSL
,
0 MMC_user
 
naïve
28.11.24
13:17
Всем добрый день.

Имеется сайт, к которому нужно подключиться по API. Проблема в том, что на сайте установлен сертификат, из-за которого подключиться не удаётся. Т.е. если входить под учеткой на сайт, всё нормально, а вот если пытаться подключиться по API, то всё время выходит 401.

Код такой:

СоединениеOpenSSL = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаФайл(ИмяФайлаСертификата));
Соединение = Новый HTTPСоединение("АдресСервера", , , , , , СоединениеOpenSSL, Истина);
ЗапросHTTP = Новый HTTPЗапрос("/api/vX/login?login=User&password=12345",);
Ответ = Соединение.Получить(ЗапросHTTP);


Сертификат в формате *.pem. Пробовал и без него, всё равно подключиться не получается. Сертификат добавил в файл cacert.pem.
Пробовал передавать логин/пароль для подключения в заголовки HTTP-запроса, затем вызывать следующий метод - не работает. Да и в целом, много всего было уже испробовано...

В качестве альтернативы уже рассматривал также и WinHttp.WinHttpRequest.5.1. Нашел на мисте ветку с примером кода от smaharbA, как включить опцию игнорирования сертификатов у этого объекта.
Как с помощью WinHTTP можна получить фотографию в пользовательском режиме 1С#23

Но у меня в функции "ПолучитьОбертку()" почему-то программа ругается на свойство "script" объекта "Док" в ней. Что надо, не понимаю.
Установил сертификат на сервер, попробовал его указать для WinHttpRequest посредством метода setClientCertificate по имени (имя присвоил в консоли оснастки) - говорит "Имя узла в сертификате недопустимо либо не соответствует".

Подскажите, пожалуйста, что можно сделать, чтобы удалось подключиться?
1 Asmody
 
28.11.24
14:06
А если серт в хранилище Windows добавить и, соответственно, конструктор ЗащищенноеСоединениеOpenSSL() поправить?
2 MMC_user
 
naïve
28.11.24
14:14
(1) Сертификат установлен в доверенные корневые центры сертификации. При указании в защищенном соединении параметра "Новый СертификатКлиентаWindows" всё равно выдает 401.
3 mikecool
 
28.11.24
14:33
(2) а его точно именно в корневые надо было установить?
4 MMC_user
 
naïve
28.11.24
14:37
(3) Насчет этого ни от кого никаких указаний не было. Полагаете, 1С может его не видеть из-за того, что его в другое хранилище надо было установить?
5 mikecool
 
28.11.24
15:50
(4) точно не знаю, но обычно при проверке серта обработкой Контура достаточно добавить серт в Личное
6 mikecool
 
28.11.24
15:51
а корневые
- это обычно центры, которые выдают сертификаты
- от них строится цепочка
7 eklmn
 
гуру
29.11.24
09:23
имхается мне что серт тут вообще ни при чем, ошибка в коде
8 Dzenn
 
гуру
29.11.24
09:29
Не очень понимаю, причём тут сертификат с твоей стороны. Не знаю ни одного АПИ, которое для обращения к себе требовало бы сертификата. Дело не в сертификате, дело в том, что ты неверно авторизовываешься, и именно об этом тебе и говорит ошибка 401. Авторизация — это обычно поле заголовка. В зависимости от типа авторизации, в заголовке либо токен в определённом формате, либо сочетание юзера/пароля тоже в определённом формате — чаще всего одно из двух, но бывают и другие варианты. Узнавай у поставщика сервиса, какой вид авторизации он требует и в каком формате ты должен его предоставлять. Можешь посоветоваться также с чатгпт, он в таких темах рубит.
9 Dzenn
 
гуру
29.11.24
09:59
В любом случае не думаю, что авторизация выглядит как "/api/vX/login?login=User&password=12345"
10 Spyke
 
29.11.24
10:21
(0) 1) Попробуй сконвертировать сертификат в pfx
    2) Обычно если авторизация базовая  по логин и пароль то в заголовках должнен передаваться Base64 Логин + ":" + Пароль
+ признак базовой авторизации обычно "Basic "
11 Spyke
 
29.11.24
10:21
+(10) ДанныеАвторизации = ДополнительныеСервисныеВозможности.СоздатьСтрокуBase64
                            (НастройкиПодключения.Логин + ":" + НастройкиПодключения.Пароль);
    ДанныеАвторизации = СтрЗаменить(ДанныеАвторизации, "77u/", "");  
    ДанныеАвторизации =  "Basic " + ДанныеАвторизации;

    Возврат ДанныеАвторизации
12 Spyke
 
29.11.24
10:49
(8) Пример: сервис "Подели" от Альфа-банка
13 Тихий омут
 
29.11.24
11:31
+(12) Прямая интеграция СБП этого же банка - то же самое.

ОбъектСертификата=Новый СертификатКлиентаФайл(мПараметрыДрайвера.РасположениеФайлаПриватногоКлюча);
СоединениеOpenSSL=Новый ЗащищенноеСоединениеOpenSSL(ОбъектСертификата);
Соединение = Новый HTTPСоединение(мПараметрыДрайвера.ПромышленныйСерверAPI,
                                        мПараметрыДрайвера.ПортПромышленногоСервераAPI,
                                        СокрЛП(мПараметрыДрайвера.ЛогинПроцессинговогоШлюза),
                                        СокрЛП(мПараметрыДрайвера.ПарольПроцессинговогоШлюза),
                                        ,
                                        ,
                                        СоединениеOpenSSL);
14 MMC_user
 
naïve
29.11.24
12:50
Коллеги, добрый день!

Всем спасибо за рекомендации. К сожалению, всё пока не успел прочитать. Буду пробовать.
15 Garykom
 
гуру
29.11.24
13:02
начать с чтения мануалов от АПИ
и примеров кода/работы не из 1С
16 бегинер
 
29.11.24
13:59
+попробуй подключиться через postman (это не из 1С),  как добьешься подключения - далее уже пробуй через 1С
17 MMC_user
 
naïve
29.11.24
15:29
(16) В postman удалось подключиться по адресу сервера, с указанными в (0) логином и паролем. Ответ такой:

https://cloud.mail.ru/public/jzf9/LSfgKLRbF

Но такого результата я уже смог добиться и в 1С. Допустим, мы залогинились успешно, дальше надо вызвать другой метод API. А как это сделать?
18 MMC_user
 
naïve
29.11.24
16:37
+Еще в postman при вызове непосредственно нужного мне метода API при отключенном значении настройки "Enable SSL certificate verification" ответ 401. Если же включить эту настройку - выдает "SSL Error: Certificate has expired". Но срок сертификата действительно уже истек. Получается, единственное решение - это поставить на сервере API сертификат с более актуальным сроком?
19 Garykom
 
гуру
30.11.24
02:17
(17) апи метро для мобильного расковыриваешь?
20 MMC_user
 
naïve
30.11.24
16:23
(19) Нет.