Имя: Пароль:
1C
1С v8
Отладка soap-запросов, отправляемых из 1С
,
0 Evgenius
 
17.04.19
14:03
Доброго времени суток.
Возникла проблема при подключении к стороннему web-сервису, а еще одна обнаружилась при попытке понять, что именно 1С передает:
1.  При вызове метода web-сервиса получаем ошибку:
"The SOAP action specified on the message, '', does not match the HTTP SOAP Action"
2. Чтобы посмотреть на сам https-запрос, установил fiddler, настроил его на расшифровку https-трафика.
В результате получил другую ошибку:
"Ошибка работы с Интернет: Удаленный узел не прошел проверку"
Ок, решил добавить сертификат, который устанавливает fiddler для расшифровки трафика, в доверенное хранилище 1С.
Экспортировал сертификат. Он имеет формат *.cer, и содержимое файла явно не подходит, чтобы вставить его в cacert.pem.
Вот здесь:
Не могу заставить работать 1С через Fiddler
автор пишет, что ему это удалось, но без подробностей. Миста, видимо, глючит, и из этого топика личное сообщение автору отправить нельзя.

Подскажите, пожалуйста, кто что знает
1) о самой первой ошибке,
2) и о добавлении в 1С-овское хранилище fiddler'овского сертификата для просмотра трафика.
Спасибо.
1 Cyberhawk
 
17.04.19
14:25
Релиз платформы?
2 Cyberhawk
 
17.04.19
14:26
После где-то 8.3.7 не нужно добавлять сертификаты в файл каталога платформы 1С, а надо в хранилище ОС добавлять
3 Evgenius
 
17.04.19
14:35
(2) Релиз 8.3.10, но в режиме совместимости с 8.2.16, если в данном случае это имеет значение.
Если так, то должно было бы работать: fiddler именно в хранилище ОС свой сертификат добавляет, при наличии прав, а права есть.
4 Asmody
 
17.04.19
14:36
(0) Сертификат надо сохранять в формате base64. Открывать блокнотом и копировать содержимое в конец cacert.pem
5 Evgenius
 
17.04.19
14:42
(4) Это понятно, вопрос не в этом, см. (0):
содержимое файла явно не подходит, чтобы вставить его в cacert.pem.
Если подробнее: это  двоичный файл, не текст в base64. Какой тут подойдет конвертер, я не знаю, OpenSSL требует точно указать формат входного файла (который я не знаю).
6 Cyberhawk
 
17.04.19
16:57
(3) Да, режим совместимости ниже 8.3.8 влечет неоходимость юзать файлик cacert.pem
7 Cyberhawk
 
17.04.19
17:02
"содержимое файла явно не подходит, чтобы вставить его в cacert.pem" // DER что ли? Ну онлайн-конвертеров тонна, как и утилитка openssl
8 Asmody
 
17.04.19
17:04
(5) Windows умеет экспортировать сертификаты в base64 (подсказка - тип файла в диалоге Сохранить)
9 Evgenius
 
18.04.19
07:43
(6) Похоже, что дело не в самом режиме совместимости, а в том, что КОНФИГУРАЦИИ, которые требуют этого режима, не используют новые возможности платформы (те, про которые вы напомнили, появившиеся после 8.3.7): я дополнил вызов функции <WSСсылка>.СоздатьWSПрокси, явно передав в нее параметр ЗащищенноеСоединение:

Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(), Новый СертификатыУдостоверяющихЦентровWindows())

В результате был подхвачен сертификат из хранилища Windows, вызов прошел, и трафик начал расшифровываться Fiddler'ом.

Так что, теперь вопрос в первой, основной проблеме:
"The SOAP action specified on the message, '', does not match the HTTP SOAP Action"

Что скажете, джентльмены?
10 Cyberhawk
 
18.04.19
07:59
Фиддлер не помог что ли?
11 Evgenius
 
18.04.19
08:29
(10) Фиддлер позволяет увидеть запрос. Но в этом запросе я никакого криминала не вижу
12 Evgenius
 
18.04.19
08:31
(10) И вообще не понимаю, что эта ошибка означает, а потому и исправить не знаю, как. В этом и вопрос: что это за ошибка
("The SOAP action specified on the message, '', does not match the HTTP SOAP Action") ?

Если я догадываюсь правильно, и дело в том, что в http-запросе нет заголовка SOAPAction, то тогда, соответственно, вопрос уточняется: как этот заголовок в http-запрос добавить
13 baza1
 
18.04.19
09:12
Тоже было с action-ом проблема, принимающая сторона принимала SOAPAction либо пустым, либо правильно заполненным.
Но проблема в 1С, что пустой заголовок не вставляется в запрос.

Т.е. если написать
    Заголовки = Новый Соответствие;
      Заголовки.Вставить("SOAPAction", "");                                                
      HTTPЗапрос = Новый HTTPЗапрос("...",Заголовки);
то заголовок SOAPAction в запросе не будет вообще, даже "", а сервис его ждал.

Пришлось явно указывать полный путь (даже не просто имя метода).

    Заголовки = Новый Соответствие;
      Заголовки.Вставить("SOAPAction", "http://.....ru/ws/..../"; + ИмяМетода);                        
      HTTPЗапрос = Новый HTTPЗапрос("....",Заголовки);

может проблема из этой серии?
14 Evgenius
 
18.04.19
12:06
(13) Скорее всего, именно из этой, но вопрос-то, есть ли решение для объекта WSПрокси
15 Сияющий в темноте
 
18.04.19
15:58
(12)он вам говорит,что указанный заголовок Action,и рисует пустую строку,не является правильным заголовком Action,который сервис ожидает.
Вам,удалось засунуть пустой заголовок,но он должен быть не пустой.
16 Cyberhawk
 
18.04.19
18:49
(11) Так осталось сравнить этот запрос с тем, что работает из СоапУИ
17 Evgenius
 
19.04.19
08:04
(15) Да, он это говорит, но если верить fiddler'у, то такого заголовка в запросе, нет, ни пустого, ни заполненного.
Есть директива action в заголовке Content-type:

POST /.../XRMServices/2011/Organization.svc HTTP/1.1
Host: ....ru
User-Agent: 1C+Enterprise/8.3
Accept: */*
Content-Type: application/soap+xml;charset=utf-8;action="http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/RetrieveMultiple";
Content-Length: 987

И самое главное, у объекта WSпрокси нет методов для установки заголовков. Так что, мне ничего не "удавалось"
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший