Коллеги, добрый день!

 

Проблема с ExchangeListener, никак не удаётся победить.

Exchange локальный, все виды авторизации включены.

Сервис ExchangeListener развернут, проверки проходят успешно.

Изображение удалено.

При попытке добавить ящик, в интерфейсе вываливается ошибка

"Указан неправильный email или пароль"

Изображение удалено.

Пробовал различным образом вводить логин. И полный email, и  domain\username.

В настройке провайдера в блоке Формат логина пробовал и использовать email, и формировать вручную.

Не помогает.

Изображение удалено.

Попытки авторизоваться в exchangeOWA и exchange/ews/exchange.asmx - проходят успешно по базовой авторизации.

В логах на вебе Creatio вижу ошибку, которую отдаёт Exchange. Такое ощущение, что ему прилетает что-то очень неожиданное.

2021-11-01 12:32:04,970 [87] WARN NT AUTHORITY\NETWORK SERVICE IsServerValid - Mailbox maxim.sedov@***.ru didn't pass validation with these credentials, info: Microsoft.Exchange.WebServices.Data.ServiceRequestException: The request failed. Resource temporarily unavailable Resource temporarily unavailable

 ---> System.Net.WebException: Resource temporarily unavailable Resource temporarily unavailable

 ---> System.Net.Http.HttpRequestException: Resource temporarily unavailable

 ---> System.Net.Sockets.SocketException (11): Resource temporarily unavailable

   at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)

   --- End of inner exception stack trace ---

   at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)

   at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean allowHttp2, CancellationToken cancellationToken)

   at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)

   at System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)

   at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)

   at System.Net.Http.AuthenticationHelper.SendWithAuthAsync(HttpRequestMessage request, Uri authUri, ICredentials credentials, Boolean preAuthenticate, Boolean isProxyAuth, Boolean doRequestAuth, HttpConnectionPool pool, CancellationToken cancellationToken)

   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)

   at System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)

   at System.Net.Http.HttpClient.FinishSendAsyncUnbuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)

   at System.Net.HttpWebRequest.SendRequest()

   at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)

   --- End of inner exception stack trace ---

   at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)

   at System.Net.WebRequest.<>c.b__68_2(IAsyncResult iar)

   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)

--- End of stack trace from previous location where exception was thrown ---

   at Microsoft.Exchange.WebServices.Data.EwsHttpWebRequest.Microsoft.Exchange.WebServices.Data.IEwsHttpWebRequest.GetResponse()

   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.GetEwsHttpWebResponse(IEwsHttpWebRequest request)

   --- End of inner exception stack trace ---

   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.GetEwsHttpWebResponse(IEwsHttpWebRequest request)

   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ValidateAndEmitRequest()

   at Microsoft.Exchange.WebServices.Data.SimpleServiceRequestBase.InternalExecuteAsync()

   at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.ExecuteAsync()

   at Microsoft.Exchange.WebServices.Data.ExchangeService.BindToFolder(FolderId folderId, PropertySet propertySet)

   at Microsoft.Exchange.WebServices.Data.ExchangeService.BindToFolder[TFolder](FolderId folderId, PropertySet propertySet)

   at ExchangeListener.EwsApi.ExchangeListenerService.b__5_0() in /src/ExchangeListener/EwsApi/ExchangeListenerService.cs:line 80

   at ListenerBase.Utils.Tracking.TimeElapsedProfiler.MeasureTime(Func`1 action) in /src/ListenerBase/Utils/Tracking/TimeElapsedProfiler.cs:line 23

   at ExchangeListener.EwsApi.ExchangeListenerService.ValidateSynchronizationCredentials() in /src/ExchangeListener/EwsApi/ExchangeListenerService.cs:line 78

   at ListenerBase.Service.Service.Validate() in /src/ListenerBase/Service/Service.cs:line 224

 

Куда рыть?

Идеи уже кончились.

 

Спасибо!

Нравится

5 комментариев
Лучший ответ

Максим, судя по записи из логов, синхронизацию блокирует именно почтовый сервер. Проверьте, пожалуйста, следующее: 



1. Используется ли двухфакторная авторизация для входа в почтовый аккаунт? 

2. Не блокирует ли почтовый сервер адрес Creatio? 

3. Нет ли нюансов по работе с ресурсами в плане SSL? Возможно сервер не может доверять Вашему экземпляру приложения по этой причине.

4. Проверьте доступность к почтовому сервису из микросервиса Exchange listener. Есть несколько вариантов:

 

   - http://cweiske.de/tagebuch/curl-mail.htm (только добавьте аутентификацию)



-v --user "логин:пароль" --login-options AUTH=PLAIN

 

Полный пример:

curl smtps://адрес сервера smtp -v --user "логин ящика:пароль" --login-options AUTH=PLAIN 



    - либо второй вариант:

 

curl адрес почтового сервера.

Максим, добрый день!



Подскажите, пожалуйста, какую версию Creatio Вы используете?

Lev Kuptsov, добрый день! 7.18.4.1532

Максим, судя по записи из логов, синхронизацию блокирует именно почтовый сервер. Проверьте, пожалуйста, следующее: 



1. Используется ли двухфакторная авторизация для входа в почтовый аккаунт? 

2. Не блокирует ли почтовый сервер адрес Creatio? 

3. Нет ли нюансов по работе с ресурсами в плане SSL? Возможно сервер не может доверять Вашему экземпляру приложения по этой причине.

4. Проверьте доступность к почтовому сервису из микросервиса Exchange listener. Есть несколько вариантов:

 

   - http://cweiske.de/tagebuch/curl-mail.htm (только добавьте аутентификацию)



-v --user "логин:пароль" --login-options AUTH=PLAIN

 

Полный пример:

curl smtps://адрес сервера smtp -v --user "логин ящика:пароль" --login-options AUTH=PLAIN 



    - либо второй вариант:

 

curl адрес почтового сервера.

Максим Седов,

Приветствую, удалось победить проблему? столкнулся с тем же самым.

Бакалов Павел Вячеславович,

Да, привет! Победили. сервис был развёрнут в кубе. В кубе был неправильно настроен DNS. Сервис ходил не на Exchange, а куда-то еще. Как раз продиагностировали по вышеуказанному мануалу.

Показать все комментарии

Сервис развертывал по этому примеру:

https://community.terrasoft.ru/articles/2-realnyy-primer-po-razvertyvaniyu-servisa-exchange-listener-s-ispolzovaniem-kubernetes

 

Сам сервис работает, через браузер открывается:

Изображение удалено.

 

Пинг с машины, на которой развернут Creatio, проходит, через telnet на 30001 порт подключается, но в Creatio при диагностике такая картина:

Изображение удалено.

 

Никто не сталкивался с таким?

 

Так же было замечено, что если зайти на сервис /0/ServiceModel/ExchangeListenerService.svc в версии 7.14, там выдается корректное сообщение:

Изображение удалено.

 

Но в новой версии 7.17, где пытаюсь настроить, была такая ошибка:

Изображение удалено.

 

Добавил в services.config в этот сервис строчку по аналогии с другими сервисами:

Теперь сервис выдает такое сообщение:

Изображение удалено.

Может это быть причиной?

Нравится

3 комментария

файрвол, не правильно проброшен порт(если через nat на гостевую машину", проверьте логи сервиса  на предмет ошибок kubectl logs  <название pod'a>

и с браузера он открывается на машине, где разврнут creatio или только на виртуалке?

Файрвол на машине, где поднят сервис, отключен. С браузера на машине, где развернут сайт с Creatio, а так же через telnet по порту 30001 на той же машине подключается. Логи смотрел. Ошибок никаких нет.

Добрый день!

 

В рамках обращения в Support Creatio, нашли очень не обычную причимну ошибки.

Проблемой оказался некорректно завершенный fiddler.

Он выступал как прокси-сервер и перенаправлял все запросы с IIS на наш проблемный адрес, по этому мы видели ошибки, а через браузер все работало.

В будущем, рекомендуем не использовать fiddler на продуктивном сервере, и в случе возникновения этой проблемы необходимо перезапустить сервер.

Показать все комментарии

В данной статье описаны алгоритмы обновления микросервиса EXCHANGE LISTENER в разных вариантах разворачивания.



Для KUBERNETES:

Необходимо запустить команду:

helm upgrade -i #параметры указать такие же как и при установке установке#

Пример установки доступный в инструкции по разворачиванию.

Актуальная версия helm пакета доступна в статье:

https://academy.terrasoft.ru/docs/user/ustanovka_i_administrirovanie/ra…



Для Docker:



Удалить запущенный контейнер с неактуальной версией Exchange Listener.

docker rm - f <container_name>

Далее запустить команду с инструкции по установке (https://academy.terrasoft.ru/docs/user/ustanovka_i_administrirovanie/razvertyvanie_onsite/nastrojka_kontejnernyh_komponentov/nastroit_servis_sinkhronizacii_exchange_listener#title-2503-4)

В последней в последней строчке необходимо указать актуальную версию Exchange Listener.

Актуальную версию Exchange Listener можно узнать в сообществе Docker Hub по ссылке.

 

Прикрепленные файлы

Нравится

Поделиться

8 комментариев

Для Docker. Не остановить, а удалить! иначе получаем 

docker: Error response from daemon: Conflict. The container name "/ExchangeListener" is already in use by container "daa7c3fcdcbd3b72de643e7f36a31cf3fc6f1e75edbb1cba1e4fad3a628751da". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.

 

Алексей Следь,

Ну тогда уж сначала остановить, а потому удалить. Иначе будет ругаться что удаляемый контейнер запущен)

 

Error response from daemon: You cannot remove a running container 2c982e783b9f96d3db07b851a1ada8a9b747f17294efd10cae3f3df49eee9313. Stop the container before attempting removal or force remove

 

Дмитрий Антохин,

Как сказала техподдержка, а эта публикация создана после моего обращения, "наши опытные пользователи doker знают последовательность действий при обновлении контейнеров."

Алексей Следь,

добрый день!

Спасибо за уточнения, мы поправили пост. Также рекомендую ознакомиться с обучающим видео по разворачиванию микросервиса.



https://www.youtube.com/watch?v=Ue9Pk92leqM

 

Алексей Следь,



Спасибо за обратную связь по использованию инструкции. Статью дополнили.

 

Коллеги, доброго дня.

 

В последней в последней строчке необходимо указать актуальную версию Exchange Listener.

Актуальную версию Exchange Listener можно узнать в сообществе Docker Hub по ссылке.

Обычно при использовании контейнеров, используется различные теги, позволяющие загружать последнюю версию контейнера, без необходимости прописывать конкретную версию, например "latest". 

 

Почему в EXCHANGE LISTENER не используется такой подход и обязательно требуется конкретизировать версию ?

 

 

Добрый день, Денис!



Зафиксировали пожелание на ответственную команду разработки для возможно реализации в будущих версиях продукта.



Спасибо, что помогаете делать наш продукт лучше!



С уважением,

Сидько Елена

Оператор

Группа компаний Terrasoft

Добрый день, подскажите пожалуйста

 

NAME                 STATUS   ROLES           AGE   VERSION

r-creatio-exl-prod   Ready    control-plane   51m   v1.25.4

почему роль у него control-plane  ставиться, а не мастер?

и при использовании

helm install --namespace default --set auth.enabled=false --set=slave.persistence.enabled=false --set master.persistence.enabled=false --set cluster.enabled=false redis bitnami/redis

wget https://academy.creatio.com/sites/default/files/documents/downloads/Exc…

helm install --set env.host=10.104.164.119 --set service.type=NodePort --set service.nodePort=30001 --set apiVersion=apps/v1 --namespace default elistener exchangelistener-0.8.39.tgz

adminka@r-creatio-exl-prod:~$ kubectl get pods

NAME               READY   STATUS             RESTARTS        AGE

elistener-api-0    0/1     CrashLoopBackOff   9 (3m16s ago)   29m

  Warning  Unhealthy  28m                    kubelet            Liveness probe failed: Get "http://10.244.0.6:80/api/listeners/exists": dial tcp 10.244.0.6:80: connect: connection refused

  Warning  Unhealthy  8m32s (x15 over 28m)   kubelet            Readiness probe failed: Get "http://10.244.0.6:80/healthcheck": dial tcp 10.244.0.6:80: connect: connection refused

  Warning  BackOff    3m32s (x101 over 27m)  kubelet            Back-off restarting failed container

Подскажите пожалуйста, как это победить? И есть ли более новые версии ExchangeListener, которые можно поставить?

https://artifacthub.io/packages/helm/bitnami/redis

--set=slave.persistence.enabled=false - почему тут равно и для slave нет никаких опций.

Показать все комментарии

По инструкции https://academy.terrasoft.ru/docs/user/ustanovka_i_administrirovanie/ra…

настроили ExchangeListenerService.

На странице диагностики работы все пунктики зеленые. Т.е. все настройки выполнены.

 

В системе добавляем новый почтовый ящик для синхронизации. Сам я щик также полностью настроен. Все разрешения выставлены.

 

При добавлении возникает ошибка "Ошибка при добавлении настроек. Обратитесь к администратору системы".

 

В консоли при этом появляется ошибка

ListenerServiceFailJob error System.Security.Cryptography.CryptographicException: Заполнение неверно и не может быть удалено.\r\n   в System.Security.Cryptography.CapiSymmetricAlgorithm.DepadBlock(Byte[] block, Int32 offset, Int32 count)\r\n   в System.Security.Cryptography.CapiSymmetricAlgorithm.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)\r\n   в System.Security.Cryptography.CryptoStream.FlushFinalBlock()\r\n   в System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing)\r\n   в System.IO.Stream.Close()\r\n   в Terrasoft.Common.PasswordCryptoProvider.DecryptValue(Object value, ICryptoTransform decryptor)\r\n   в Terrasoft.Core.SecureTextDataValueType.GetValueForLoad(UserConnection userConnection, Object value)\r\n   в Terrasoft.Core.Entities.EntityColumnValue.LoadValue(Object value)\r\n   в Terrasoft.Core.Entities.EntityColumnValueCollection.ForceLoadColumnValue(String name, Object value)\r\n   в Terrasoft.Core.Entities.Entity.LoadShallow(IDataReader dataReader, Dictionary`2 columnMap)\r\n   в Terrasoft.Core.Entities.EntityCollection.LoadShallow(IDataReader dataReader, Dictionary`2 columnMap, Boolean needClear)\r\n   в Terrasoft.Core.Entities.EntitySchemaQuery.GetEntitySchemaEntityCollection(UserConnection userConnection, IDataReader dataReader)\r\n   в Terrasoft.Core.Entities.EntitySchemaQuery.d__343.MoveNext()\r\n--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---\r\n   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   в Terrasoft.Core.Entities.EntitySchemaQuery.GetEntityCollection(UserConnection userConnection)\r\n   в IntegrationV2.MailboxDomain.Repository.MailboxRepository.GetAll(Boolean userMailboxesOnly, Boolean useForSynchronization)\r\n   в IntegrationV2.MailboxDomain.MailboxService.GetAllSynchronizableMailboxes()\r\n   в Terrasoft.Configuration.ListenerServiceFailJob.GetSynchronizableMailboxes()\r\n   в Terrasoft.Configuration.ListenerServiceFailJob.GetMailboxesWithoutSubscriptions()\r\n   в Terrasoft.Configuration.ListenerServiceFailJob.Execute(UserConnection userConnection, IDictionary`2 parameters)\r\nSystem.Security.Cryptography.CryptographicException: Заполнение неверно и не может быть удалено.\r\n   в System.Security.Cryptography.CapiSymmetricAlgorithm.DepadBlock(Byte[] block, Int32 offset, Int32 count)\r\n   в System.Security.Cryptography.CapiSymmetricAlgorithm.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)\r\n   в System.Security.Cryptography.CryptoStream.FlushFinalBlock()\r\n   в System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing)\r\n   в System.IO.Stream.Close()\r\n   в Terrasoft.Common.PasswordCryptoProvider.DecryptValue(Object value, ICryptoTransform decryptor)\r\n   в Terrasoft.Core.SecureTextDataValueType.GetValueForLoad(UserConnection userConnection, Object value)\r\n   в Terrasoft.Core.Entities.EntityColumnValue.LoadValue(Object value)\r\n   в Terrasoft.Core.Entities.EntityColumnValueCollection.ForceLoadColumnValue(String name, Object value)\r\n   в Terrasoft.Core.Entities.Entity.LoadShallow(IDataReader dataReader, Dictionary`2 columnMap)\r\n   в Terrasoft.Core.Entities.EntityCollection.LoadShallow(IDataReader dataReader, Dictionary`2 columnMap, Boolean needClear)\r\n   в Terrasoft.Core.Entities.EntitySchemaQuery.GetEntitySchemaEntityCollection(UserConnection userConnection, IDataReader dataReader)\r\n   в Terrasoft.Core.Entities.EntitySchemaQuery.d__343.MoveNext()\r\n--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---\r\n   в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   в Terrasoft.Core.Entities.EntitySchemaQuery.GetEntityCollection(UserConnection userConnection)\r\n   в IntegrationV2.MailboxDomain.Repository.MailboxRepository.GetAll(Boolean userMailboxesOnly, Boolean useForSynchronization)\r\n   в IntegrationV2.MailboxDomain.MailboxService.GetAllSynchronizableMailboxes()\r\n   в Terrasoft.Configuration.ListenerServiceFailJob.GetSynchronizableMailboxes()\r\n   в Terrasoft.Configuration.ListenerServiceFailJob.GetMailboxesWithoutSubscriptions()\r\n   в Terrasoft.Configuration.ListenerServiceFailJob.Execute(UserConnection userConnection, IDictionary`2 parameters)

 

Что не так с почтой? Что именно нужно еще настроить для корректной работы синхронизации почты?

Нравится

2 комментария

Оксана, здравствуйте!

 

Согласно ошибке, то у вас проблема с дешифрованием хэшей.

Посмотрите, пожалуйста, на уровне БД есть ли в таблице MailboxSyncSettings некорректные данные (это актуально если запись почтового ящика была добавлена уровне БД и, например, UserPassword пустой).

 

Уточните, пожалуйста:

- это ваше первое добавление почтового ящика (на уровне БД есть записи в MailboxSyncSettings). Если они не нужны, то можете попробовать удалить и заново добавить почтовый ящик.

- вы недавно обновлялись с версии на версию? Если да,  то с какой версии и на какую (нужна точная версия)?

- какой тип почтового провайдера вы добавляете (Exchange, Gsuite и т.д.)?

Вильшанский Дмитрий,

Да, действительно. В MailboxSyncSettings оказался ящик без действующего пароля. Спасибо!

Показать все комментарии