带有卷标的NTLM返回401

目标 :连接到Exchange服务器(EWS)
方法 :cURL
问题 :无法获得身份validation(NTLM),请求返回401

似乎有一个旧的,有据可查的2问题,从cURL从OpenSSL转移到NSS开始。 我读到NTLM的实现依赖于OpenSSL,因此这一举动打破了NTLM身份validation。

这个问题如下所示,但重要的部分似乎是返回401和下面的gss_init_sec_context()

我不明白的是我目前的版本:

  • 根据https://launchpad.net/ubuntu/+source/curl/7.22.0-3ubuntu4有一个OpenSSL变种
  • 根据同一链接支持NTLM
  • 其实根据下面的日志使用这个变种(而不是NSS)(它说libcurl/7.22.0 OpenSSL
  • 根据以上几点,不应该被链接的bug所困扰。
  • 但是IS受到了影响,正如我得到401的事实所显示的那样

我不确定如何解决这个问题。 我可以find很多旧的(大部分是2010年)提到这个问题,但没有新的东西,肯定没有一个溶剂。 我知道提供的参考(见2 )表明,这可能与旧版本(7.19),但我不能(也不愿意)降级到该版本。

Exchange通信(EWS)的几个实现使用cURL来检索EWS文件(wsdl等),所以我确定必须有一个工作方法,但我找不到它。 有没有人有线索我可以做什么? 我还有另外一个错误吗?我是否解释了错误的事实,这个情况和链接中提供的情况是一样的,它永远不会被修复吗?


1错误是这样的:

 curl https://*DOMAIN*/Exchange.asmx -w %{http_code} --ntlm -u *USERNAME* --verbose --show-error Enter host password for user '*USERNAME': * About to connect() to DOMAIN port 443 (#0) * Trying IP... connected * successfully set certificate verify locations: * CAfile: none CApath: /etc/ssl/certs * SSLv3, TLS handshake, Client hello (1): * SSLv3, TLS handshake, Server hello (2): * SSLv3, TLS handshake, CERT (11): * SSLv3, TLS handshake, Server finished (14): * SSLv3, TLS handshake, Client key exchange (16): * SSLv3, TLS change cipher, Client hello (1): * SSLv3, TLS handshake, Finished (20): * SSLv3, TLS change cipher, Client hello (1): * SSLv3, TLS handshake, Finished (20): * SSL connection using AES128-SHA * Server certificate: *SNIP* * SSL certificate verify ok. * Server auth using NTLM with user 'USERNAME' > GET /EWS/Exchange.asmx HTTP/1.1 > Authorization: NTLM *snip* > User-Agent: curl/7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 > Host: DOMAIN > Accept: */* > < HTTP/1.1 401 Unauthorized < Server: Microsoft-IIS/7.5 < Set-Cookie: exchangecookie=xxx; expires=Wed, 17-Jul-2013 07:45:30 GMT; path=/; HttpOnly < WWW-Authenticate: NTLM *SNIP* * gss_init_sec_context() failed: : Credentials cache file '/tmp/krb5cc_1005' not foundWWW-Authenticate: Negotiate < X-Powered-By: ASP.NET < Date: Tue, 17 Jul 2012 07:45:30 GMT < Content-Length: 0 < * Connection #0 to host DOMAIN left intact * Closing connection #0 * SSLv3, TLS alert, Client hello (1): 

2例如:

  • https://bugs.launchpad.net/ubuntu/+source/curl/+bug/675974
  • https://bugzilla.redhat.com/show_bug.cgi?id=603783
  • https://stackoverflow.com/questions/4341368/curl-always-returns-401-with-ntlm
    • 这是同样的问题,但是并没有解决这个问题,即我的OpenSSL libcurl中不应该存在NSS问题。

curl信息:

 user@server:~$ curl -V curl 7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 Protocols: dict file ftp ftps gopher http https imap imaps ldap pop3 pop3s rtmp rtsp smtp smtps telnet tftp Features: GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP 

我不确定为什么,但是当我的7.22版本不应该受整个NTLM问题的影响时,似乎是这样。

唯一的解决scheme似乎是使用旧的(<7.19,我试过7.15)版本或使用新版本(我试过7.26)。 如上所述,我不能降级或升级libcurl本身只是为了这个function。 这意味着我们需要find一个解决方法….

使用的解决方法(警告:黑客出现)

  1. 下载并编译你想使用的curl。 我没有这样做根/ /这是因为我不想取代当前的libcurl等!

     wget http://curl.haxx.se/download/curl-7.26.0.zip ./configure --prefix=/local_path/ make make install 
  2. testing我们刚刚编译的新curl命令:它确实给出了401,但是接着代替gss_init_sec_context()你应该看到302(最终)302.这就是胜利。

  3. 黑客部分:调用脚本时使用这个libcurl 。 我们正在使用第三方的PHP“app”(我不喜欢改变所有的curl库),而不是直接调用这个,我们做一个丑陋的,但工作的包装,这个叫这样的东西:

     $se = shell_exec("LD_LIBRARY_PATH=/local_path/lib php /path/3rdparty.php"); 

是的,这有缺点,是的,这是一个骨架的例子(这意味着你可能想添加一些东西,例如可能原来的path),但基本知识是有点。

对此我并不感到骄傲,但是我认为更多的人受到这样一个事实的制约,他们不能只是去更新他们的libcurl到一个随机的版本,并且正在使用某种插件,例如php-ews ,或者任何build立在NTLMSoapClient上的NTLMSoapClient

我希望还有另外一个select,但是现在这是唯一能让它“运作”的方法,我想我会分享的。

对于所有的Centos / RHEL 6.X用户来看看:

https://bugzilla.redhat.com/show_bug.cgi?id=953864