Curl、NuSoap、PHP与Exchange服务器对话身份验证错误

Curl、NuSoap、PHP与Exchange服务器对话身份验证错误,php,soap,curl,exchange-server,ubuntu-10.04,Php,Soap,Curl,Exchange Server,Ubuntu 10.04,我有一个PHP脚本,它一直在使用NuSOAP和curl来使用ExchangeWeb服务。我让它工作得很好,与一个稍旧的exchange版本以及exchange 2010进行了交谈 就在最近,我们在服务器上进行了操作系统升级,升级了很多软件包。从那时起,交换代码就不起作用了。它在较旧的服务器上仍然可以正常工作,但根本不会与Exchange2010服务器通信 返回的错误为“HTTP身份验证失败” 当然,我已经进行了三次检查,以确保用户名和密码正确无误,代码没有更改,服务器也没有更改,因此这似乎与服务

我有一个PHP脚本,它一直在使用NuSOAP和curl来使用ExchangeWeb服务。我让它工作得很好,与一个稍旧的exchange版本以及exchange 2010进行了交谈

就在最近,我们在服务器上进行了操作系统升级,升级了很多软件包。从那时起,交换代码就不起作用了。它在较旧的服务器上仍然可以正常工作,但根本不会与Exchange2010服务器通信

返回的错误为“HTTP身份验证失败”

当然,我已经进行了三次检查,以确保用户名和密码正确无误,代码没有更改,服务器也没有更改,因此这似乎与服务器软件升级有关

但奇怪的是,它仍然适用于较旧的exchange服务器

它被告知不要验证ssl证书,因为它们是自签名的,因为它们目前是测试机器,所以我认为这不是证书验证错误。我可以通过浏览器对exchange服务器上的web服务进行身份验证和查看,以便知道它仍然处于活动状态

该服务器是一台刚刚升级到10.04.4的Ubuntu服务器

这是一段代码,它在旧版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));
$client=newnusoap\u客户端($webservice\u wsdl,true);
$client->setCredentials($exch_user,$exch_pass,'ntlm');
$client->setUseCURL(true);
$client->useHTTPPersistentConnection();
$client->setcurlpoption(CURLOPT_HTTPAUTH,CURLAUTH_NTLM);
$client->setcurlpoption(CURLOPT_USERPWD,$exch_user.:'。$exch_pass);
$client->setcurlpoption(curlpot\u SSL\u VERIFYPEER,false);
$client->setcurlpoption(curlpot\u SSL\u VERIFYHOST,false);
$client->soap_defencoding='UTF-8';
$xml='';
$xml.='';
$xml.='IdOnly';
$xml.='';
$xml.='';
$xml.='';
$xml.='';
$xml.='';
$xml.='';
$xml.='';
$xml.='';
$xml.='';
$xml.='';
$xml.='';
$xml.='';
$xml.='';
$xml.='';
$xml.=''.$fxml;
$xml.='';
$xml.='';
$result=$client->call('FindItem',utf8_encode($xml));

我想我已经找到了问题所在——至少在解决问题方面。在某个时间点,一定有更新(Windows或Unix)破坏了通过NTLM进行正确通信的能力

我的服务器使用curl版本7.21。我有一个Linode也使用了7.21,但是因为我可以使用它,我将curl(使用SSL)升级到了7.26版本,它提供了NTLMv2支持(7.21没有)。根据我找到的唯一一个帮助我获取这些信息的网站,7.25版显然也起到了作用:

我在这里的回答是作为一个答案,但我不能肯定地说这是事实上的答案。至少这是一个可能的答案。

您可以使用示例获取nusoap类,请参见下面的url
You can get nusoap classes with samples see below url

http://sourceforge.net/projects/nusoap/

Try This

<?php
/*
 *  $Id: wsdlclient3b.php,v 1.1 2004/06/15 15:38:29 snichol Exp $
 *
 *  WSDL client sample.
 *
 *  Service: WSDL
 *  Payload: rpc/encoded (params as an XML string; cf. wsdlclient3.php)
 *  Transport: http
 *  Authentication: none
 */
require_once('../lib/nusoap.php');
$proxyhost = isset($_POST['proxyhost']) ? $_POST['proxyhost'] : '';
$proxyport = isset($_POST['proxyport']) ? $_POST['proxyport'] : '';
$proxyusername = isset($_POST['proxyusername']) ? $_POST['proxyusername'] : '';
$proxypassword = isset($_POST['proxypassword']) ? $_POST['proxypassword'] : '';
$client = new soapclient('http://www.scottnichol.com/samples/hellowsdl2.php?wsdl', true, $proxyhost, $proxyport, $proxyusername, $proxypassword);
$err = $client->getError();
if ($err) {
    echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
}
$params = '<person xsi:type="tns:Person"><firstname xsi:type="xsd:string">Willi</firstname><age xsi:type="xsd:int">22</age><gender xsi:type="xsd:string">male</gender></person>';
$result = $client->call('hello', $params);
// Check for a fault
if ($client->fault) {
    echo '<h2>Fault</h2><pre>';
    print_r($result);
    echo '</pre>';
} else {
    // Check for errors
    $err = $client->getError();
    if ($err) {
        // Display the error
        echo '<h2>Error</h2><pre>' . $err . '</pre>';
    } else {
        // Display the result
        echo '<h2>Result</h2><pre>';
        print_r($result);
        echo '</pre>';
    }
}
echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';
?>
http://sourceforge.net/projects/nusoap/ 试试这个 getError(); 如果($err){ 回显“构造函数错误”。$err.'; } $params='Willi22male'; $result=$client->call('hello',$params); //检查故障 如果($client->fault){ 回声“故障”; 打印(结果); 回声'; }否则{ //检查错误 $err=$client->getError(); 如果($err){ //显示错误 回显“错误”。$err.'; }否则{ //显示结果 回应“结果”; 打印(结果); 回声'; } } 回显“请求”。htmlspecialchars($client->request,ENT_QUOTES)。”; 回应“回应”。htmlspecialchars($client->response,ENT_QUOTES)。”; 回显“调试”。htmlspecialchars($client->debug_str,ENT_QUOTES)。”; ?>
您确定您的Exchange已配置为使用NTLM身份验证吗?是的,它到目前为止一直没有更改。我查过了。exchange服务器上没有任何更改。我也遇到了同样的问题,Tim。你设法弄明白你的想法了吗?谢天谢地,我们使用的身份验证还在本地存储了用户名和密码的单向散列和盐渍版本,因此人们仍然可以进行身份验证,但当人们更改ActiveDirectory密码时,现在出现了断开连接。。。我发现,当我使用下面的代码时,事情似乎是可行的……但具有讽刺意味的是,当我使用从过程代码创建的OOP类时,它却不起作用。如果我找到了一个解决方案,我一定会回来发布我的发现。是的……我终于用OOP类在我的开发框中完成了所有工作——我想我的编辑器在XML中插入了选项卡,而不是EWS不喜欢的软空间。将其转移到生产中,但仍然无法正常工作。尝试在dev上使用CURL版本-效果很好。转移到生产-同样的结果。我相信我们的盒子是Debian 6.0发行版。。。NuSOAP调试并不能说明什么。