目标 :连接到Exchange服务器(EWS)
方法 :cURL
问题 :无法获得身份validation(NTLM),请求返回401
似乎有一个旧的,有据可查的2问题,从cURL从OpenSSL转移到NSS开始。 我读到NTLM的实现依赖于OpenSSL,因此这一举动打破了NTLM身份validation。
这个问题如下所示,但重要的部分似乎是返回401和下面的gss_init_sec_context() 。
我不明白的是我目前的版本:
libcurl/7.22.0 OpenSSL ) 我不确定如何解决这个问题。 我可以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例如:
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一个解决方法….
使用的解决方法(警告:黑客出现)
下载并编译你想使用的curl。 我没有这样做根/ /这是因为我不想取代当前的libcurl等!
wget http://curl.haxx.se/download/curl-7.26.0.zip ./configure --prefix=/local_path/ make make install
testing我们刚刚编译的新curl命令:它确实给出了401,但是接着代替gss_init_sec_context()你应该看到302(最终)302.这就是胜利。
黑客部分:调用脚本时使用这个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用户来看看: