Я использую Microsoft EWS api, чтобы получать электронные письма с локального сервера Exchange. Учитывая, что Microsoft отказалась от разработки, я использую вилку sherlock1982 из ews api . Мое приложение написано на. net core 2.1 и при работе на моем локальном P C (win10), все работает хорошо. Учитывая, что это Linux, невозможно автоматически получить URL-адрес автообнаружения, поэтому я вручную устанавливаю его в коде, как это предлагается на странице github.
public async void GetInbox()
{
string ewsUrl = "https://mail.domain.com/EWS/Exchange.asmx";
try
{
var service = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
service.UseDefaultCredentials = false;
// service.Credentials = new NetworkCredential("domainUsername", "password", "domain");
service.Url = new Uri(ewsUrl);
Mailbox mb = new Mailbox("emailAddress");
var cache = new System.Net.CredentialCache();
cache.Add(service.Url, "NTLM", new
System.Net.NetworkCredential("domainUsername", "password",
"domain"));
service.Credentials = cache;
FolderId fid = new FolderId(WellKnownFolderName.Inbox, mb);
Folder inbox = await Folder.Bind(service, fid);
if (inbox != null)
{
_database.LogEvent("LOG", "GetInbox", $"InboxCount: {inbox.TotalCount}");
}
}
catch (Exception e)
{
_database.LogEvent("Error", "GetInbox", $"{e.Message}");
}
}
При развертывании на тестовом сервере с CentOS7 я получаю следующее сообщение:
Запрос не выполнен. Не удалось установить SSL-соединение, см. Внутреннее исключение.
at Microsoft.Exchange.WebServices.Data.EwsHttpWebRequest.GetResponse(CancellationToken token) in D:\dev_in_progress\ews-managed-api-master\Core\EwsHttpWebRequest.cs:line 147
at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.GetEwsHttpWebResponse(IEwsHttpWebRequest request, CancellationToken token) in D:\dev_in_progress\ews-managed-api-master\Core\Requests\ServiceRequestBase.cs:line 798
--- End of inner exception stack trace ---
at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.GetEwsHttpWebResponse(IEwsHttpWebRequest request, CancellationToken token) in D:\dev_in_progress\ews-managed-api-master\Core\Requests\ServiceRequestBase.cs:line 808
at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ValidateAndEmitRequest(CancellationToken token) in D:\dev_in_progress\ews-managed-api-master\Core\Requests\ServiceRequestBase.cs:line 688
at Microsoft.Exchange.WebServices.Data.SimpleServiceRequestBase.InternalExecuteAsync(CancellationToken token) in D:\dev_in_progress\ews-managed-api-master\Core\Requests\SimpleServiceRequestBase.cs:line 57
at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.ExecuteAsync(CancellationToken token) in D:\dev_in_progress\ews-managed-api-master\Core\Requests\MultiResponseServiceRequest.cs:line 134
at Microsoft.Exchange.WebServices.Data.ExchangeService.BindToFolder(FolderId folderId, PropertySet propertySet, CancellationToken token) in D:\dev_in_progress\ews-managed-api-master\Core\ExchangeService.cs:line 325
at Microsoft.Exchange.WebServices.Data.ExchangeService.BindToFolder[TFolder](FolderId folderId, PropertySet propertySet, CancellationToken token) in D:\dev_in_progress\ews-managed-api-master\Core\ExchangeService.cs:line 345
at ExchangeFiles.Email.Download_PI_Files_Email() in D:\dev_in_progress\get_emails_v1\ExchangeFiles\Email.cs:line 199
Я пробовал игнорировать сертификат с помощью ServicePointManager .ServerCertificateValidationCallback + = (sender, cert, chain, sslPolicyErrors) => true;
, но безуспешно (я получаю ту же ошибку).
ОБНОВЛЕНИЕ : я добавил следующий фрагмент кода
ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) =>
{
if (cert.GetCertHashString().ToLower() == "someHashCert")
{
return true;
}
if (sslPolicyErrors == SslPolicyErrors.None)
{
return true; //Is valid
}
return false;
}
внутри кода для создания HttpClientHandler. Его ввод внутри if "cert.GetCertHashString (). ToLower ()", что хорошо. Я скопировал значение someHashCert из браузера. Я также попытался установить
AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);
Но ошибка с этим кодом (и выше при проверке сертификата): запрос не удался. Обработчик не поддерживает настраиваемую обработку сертификатов с этой комбинацией libcurl (7.29.0) и его бэкэнда SSL ("NSS / 3.44"). Требуется серверная часть SSL на основе OpenSSL / 1.0.2k-fips. Рассмотрите возможность использования System. Net .Http.SocketsHttpHandler.
Если я установил
AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", true);
, я получаю: запрос не выполнен. Операция GSSAPI завершилась ошибкой - был запрошен неподдерживаемый механизм (неизвестная ошибка).
Я также пытался настроить обратный вызов для сертификата от MS do c cert для ews api , но затем Я получаю сообщение «Невозможно получить сертификат местного эмитента».
Не уверен, это шаг вперед или назад ... У меня такое ощущение, что я перепробовал все ...
UPDATE2 Версия ExchangeSever - 2016, используется аутентификация NTLM и TLS1.0 / 1.1
Я пробовал curl -v -k -i --anyauth -u: mail.server.domain: 443 и там написано
* About to connect() to mail.server.domain: port 443 (#0)
* Trying xx.xx.xx.xxx...
* Connected to mail.server.domain (xx.xx.xx.xxx) port 443 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: mail.server.domain::443
> Accept: */*
Любая идея приветствуется ... Спасибо