Curl, NuSoap, PHP разговаривают с ошибкой аутентификации сервера Exchange

У меня есть PHP-скрипт, который использует NuSOAP с curl для использования веб-служб Exchange. У меня он работал довольно хорошо, разговаривая с более старой версией Exchange, а также с Exchange 2010.

Совсем недавно мы обновили ОС на сервере, в результате чего было обновлено множество пакетов. С тех пор код Exchange не работает. Он по-прежнему отлично работает со старым сервером, но вообще не взаимодействует с сервером Exchange 2010.

Возвращается ошибка: «Ошибка аутентификации HTTP».

Я, конечно, трижды проверил, чтобы убедиться, что имена пользователей и пароли верны, и код не изменился, и серверы не изменились, поэтому, похоже, это как-то связано с обновлением программного обеспечения сервера.

Кажется странным, что он все еще работает со старым сервером обмена.

Сказано не проверять сертификаты ssl, поскольку они являются самоподписанными из-за того, что в данный момент являются тестовыми машинами, поэтому я не думаю, что это ошибка проверки сертификата. Я могу аутентифицировать и просматривать веб-службу на сервере обмена через браузер, поэтому я знаю, что она все еще активна.

Сервер представляет собой сервер Ubuntu, который только что был обновлен до версии 10.04.4.

Это часть кода, который работал и до сих пор работает со старым сервером Exchange.

    $client = new nusoap_client($webservice_wsdl, true);
$client->setCredentials($exch_user, $exch_pass, 'ntlm');
$client->setUseCURL(true);
$client->useHTTPPersistentConnection();
    $client->setCurlOption(CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
$client->setCurlOption(CURLOPT_USERPWD, $exch_user.':'.$exch_pass);
$client->setCurlOption(CURLOPT_SSL_VERIFYPEER, false);
$client->setCurlOption(CURLOPT_SSL_VERIFYHOST, false);
$client->soap_defencoding = 'UTF-8';

$xml = '<FindItem xmlns="http://schemas.microsoft.com/exchange/services/2006/messages"';
$xml .= ' xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" Traversal="Shallow">';
$xml .= '   <ItemShape>';
$xml .= '       <t:BaseShape>IdOnly</t:BaseShape>';
$xml .= '       <t:AdditionalProperties>';
$xml .= '           <t:FieldURI FieldURI="message:From"/>';
$xml .= '           <t:FieldURI FieldURI="item:Subject"/>';
$xml .= '           <t:FieldURI FieldURI="message:IsRead"/>';
$xml .= '           <t:FieldURI FieldURI="item:DateTimeReceived"/>';
$xml .= '           <t:FieldURI FieldURI="calendar:Start"/>';
$xml .= '           <t:FieldURI FieldURI="calendar:End"/>';
$xml .= '           <t:FieldURI FieldURI="calendar:Location"/>';
$xml .= '           <t:FieldURI FieldURI="task:Status"/>';
$xml .= '           <t:FieldURI FieldURI="task:DueDate"/>';
$xml .= '       </t:AdditionalProperties>';
$xml .= '   </ItemShape>';
$xml .= '   <IndexedPageItemView Offset="'.$position.'" MaxEntriesReturned="5" BasePoint="Beginning"/>';
$xml .= '   <ParentFolderIds>';
$xml .= '       '.$fxml;
$xml .= '   </ParentFolderIds>';
$xml .= '</FindItem>';

$result = $client->call('FindItem', utf8_encode($xml));

person Tim    schedule 06.03.2012    source источник
comment
Вы уверены, что ваш Exchange настроен на использование аутентификации NTLM?   -  person Kniganapolke    schedule 06.03.2012
comment
Да, так было до сих пор и не менялось. Я проверил это. На серверах обмена ничего не изменилось.   -  person Tim    schedule 07.03.2012
comment
У меня была такая же проблема, Тим. Удалось ли вам разобраться в себе? К счастью, аутентификация, которую мы использовали, также хранила локально одностороннюю хешированную и соленую версию имен пользователей и паролей, поэтому люди все еще могли аутентифицироваться, но когда люди меняют свои пароли ActiveDirectory, теперь происходит разъединение... Я обнаружил, что когда я использую следующий код, кажется, все работает... но по иронии судьбы, когда я использую класс ООП, который я создал из процедурного кода, это не так. stackoverflow.com/a/3998859/155421 Если я найду решение, я обязательно вернусь и опубликую свой результаты.   -  person BrendonKoz    schedule 19.07.2012
comment
Да... наконец-то все заработало в моем блоке разработчика с классом ООП - я думаю, что мой редактор вставил вкладки в XML вместо программных пространств, которые не нравились EWS. Перенес его в производство, и он все еще не работает. Пробовал использовать вашу версию CURL на dev - работало нормально. Перешел на производство - тот же результат. Я полагаю, что наша коробка - это дистрибутив Debian 6.0... Отладка NuSOAP мало что говорит.   -  person BrendonKoz    schedule 19.07.2012


Ответы (1)


Я думаю, что нашел проблему - по крайней мере, в отношении ее исправления. В какой-то момент должно было быть обновление (либо для Windows, либо для Unix), которое нарушило возможность правильной связи через NTLM.

Мой сервер использует curl версии 7.21. У меня был Linode, который также использовал 7.21, но, поскольку я могу играть с ним, я обновил curl (с SSL) до версии 7.26, которая обеспечивает поддержку NTLMv2 (чего не было в 7.21). Согласно единственному веб-сайту, который я нашел, чтобы помочь с этой информацией, по-видимому, версия 7.25 также работала: http://blog.ianty.com/ubuntu/exchange-web-services-ews-ntlmv2-and-linux/

Я отвечаю здесь как ответ, но я не могу окончательно сказать, что это на самом деле ответ. По крайней мере, это один из возможных ответов.

person BrendonKoz    schedule 25.07.2012