PHP + Curl:协商身份验证时关闭连接(HTTP 1.0?)

问题描述 投票:5回答:1

我在CURL和PHP之间有问题。我试图通过EWS连接到Exchange 2010服务器。与服务器的连接可以在命令行中使用CURL正常运行,但不能与PHP Curl扩展名兼容。

我在映像上附加了调试信息。在左侧,您可以看到命令行输出,在右侧是PHP的详细输出。当PHP Curl Extension引发错误“协商身份验证时关闭连接(HTTP 1.0?)”时,命令行将继续第三个HTTP请求,并在HTTP / 1.1 302中找到结果:

log information

一些其他信息:

  • 我将此库用于CURL请求:https://github.com/jamesiarmes/php-ntlm/blob/master/src/SoapClient.php
  • 我们有大约80台交换服务器,没有问题。仅此服务器存在问题。我们的客户告诉了一个称为“ Sophos”的软件,该软件用作Web服务器的代理]
  • CURLOPT_HTTPAUTH是CURLAUTH_NTLM
  • PHP版本7.3.1 / 7.3.9也经过测试
  • 也已测试cURL信息7.63.0 / 7.52.1

有人知道为什么PHP Curl Extension在第三个请求之前关闭连接吗?这是扩展程序的错误吗?我可以使用PHP Curl的常量来避免这种情况吗?还是有其他解决方法?

感谢您的帮助。

php email curl exchangewebservices php-curl
1个回答
2
投票

连接已关闭,因为服务器这样说。请查看您的屏幕截图,在“问题出在哪里?”上方的一行上。点。

HTTP/1.1 401 Unauthorized
[...]
Connection: close
Content-Type: application/x-asmx

然后服务器可能会关闭连接。

所以这不是一个动作,而是结果。该消息在Curl_http_readwrite_headers中发出:

Curl_http_readwrite_headers

大概是从第一个块(NTLM)开始,但是这是两次出现,而且它们彼此相邻。

有趣的事实:只有相同的函数#if defined(USE_NTLM) if(conn->bits.close && (((data->req.httpcode == 401) && (conn->http_ntlm_state == NTLMSTATE_TYPE2)) || ((data->req.httpcode == 407) && (conn->proxy_ntlm_state == NTLMSTATE_TYPE2)))) { infof(data, "Connection closure while negotiating auth (HTTP 1.0?)\n"); data->state.authproblem = TRUE; } #endif #if defined(USE_SPNEGO) if(conn->bits.close && (((data->req.httpcode == 401) && (conn->http_negotiate_state == GSS_AUTHRECV)) || ((data->req.httpcode == 407) && (conn->proxy_negotiate_state == GSS_AUTHRECV)))) { infof(data, "Connection closure while negotiating auth (HTTP 1.0?)\n"); data->state.authproblem = TRUE; } 会检查a lot later标头的存在,因此设置神秘标志Connection: close可能意味着服务器已断开连接,并且已在套接字级别检测到该连接。

旁注:比较的两个方面显示出非常不同的相互作用。在左侧,实际上是一个空的conn->bits.close请求(提供了GETHostAuthorizationUser-Agent标头),而在右侧,则存在许多更复杂的Accept请求(相同标头加POSTMethod,带有SOAPAction的空内容,以继续)。

© www.soinside.com 2019 - 2024. All rights reserved.