AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 408421
Accepted
Nanne
Nanne
Asked: 2012-07-18 00:15:55 +0800 CST2012-07-18 00:15:55 +0800 CST 2012-07-18 00:15:55 +0800 CST

带有 cURL 的 NTLM 返回 401

  • 772

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

似乎有一个古老的、有据可查的2问题,它始于 cURL 从 OpenSSL 到 NSS 的迁移。我读到 NTLM 的实现依赖于 OpenSSL,因此此举破坏了 NTLM 身份验证。

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

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

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

我不确定如何解决这个问题。我可以找到很多关于这个问题的旧的(主要是 2010 年的)参考,但没有新的,当然也没有解决方案。我知道提供的参考资料(参见2)表明这可能适用于旧版本 (7.19),但我不能(也不愿意)降级到该版本。

Exchange-communication (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
    • 这是同一个问题,但没有解决我的libcurlNSS中不应该出现该问题的事实。OpenSSL

卷曲信息:

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
linux exchange exchange-2010 curl ntlm
  • 2 2 个回答
  • 13122 Views

2 个回答

  • Voted
  1. Best Answer
    Nanne
    2012-07-19T05:28:39+08:002012-07-19T05:28:39+08:00

    我不确定为什么,但是虽然我的 7.22 版本不应该受到整个 NTLM 问题的影响,但它似乎是。

    唯一的解决方案似乎是使用旧版本(<7.19,我试过 7.15)或使用新版本(我试过 7.26)。如前所述,我不能仅仅为了这个功能而降级或升级 libcurl 本身。这意味着我们需要找到解决方法......

    使用的解决方法(警告:黑客即将到来)

    1. 下载并编译您要使用的 curl。我没有以 root 身份执行此操作 //sudo这是因为我不想替换当前的 libcurl 等!

      wget http://curl.haxx.se/download/curl-7.26.0.zip
      ./configure --prefix=/local_path/
      make
      make install
      
    2. 测试我们刚刚编译的新curl命令:它确实给出了 401,但是gss_init_sec_context()你应该看到它变成了(最后)302 而不是 。这是成功的。

    3. hack 部分:libcurl调用脚本时使用它。我们正在使用第 3 方 PHP“应用程序”(我不喜欢更改所有 curl 库的原因之一),而不是直接调用它,我们制作了一个丑陋但有效的包装器,它调用了这样的东西:

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

    是的,这有缺点,是的,这是一个骨架示例(意味着您可能想添加一些东西,例如原始路径),但基础知识有点在那里。

    并不是真的为此感到自豪,但我认为更多的人被这样一个事实所束缚:他们不能只是去更新他们libcurl的随机版本并且正在使用某种使用 eg 的插件php-ews,或者任何基于NTLMSoapClient.

    我希望还有另一种选择,但由于这是目前让它“工作”的唯一方法,我想我会分享。

    • 1
  2. Ruben Herold
    2013-04-20T07:53:05+08:002013-04-20T07:53:05+08:00

    对于所有 Centos /RHEL 6.X 用户,请查看:

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

    • 0

相关问题

  • 如何将我的所有数据从 Exchange 2003 迁移到 Exchange 2007?

  • Exchange 2007 的备份解决方案

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve