curl 停止协商 SPNEGO - 未知 mech-code 0 for mech unknown

Posted

技术标签:

【中文标题】curl 停止协商 SPNEGO - 未知 mech-code 0 for mech unknown【英文标题】:curl stops negotiating SPNEGO - unknown mech-code 0 for mech unknown 【发布时间】:2016-01-16 16:34:09 【问题描述】:

我尝试使用 curl 连接到 SPNEGO 安全网站(在 Mac OS X 10.10 上,附带 curl)

$curl -vv --negotiate -u : http://xxx-MacBook-Pro.local:8080 * 重建 URL 至:http://xxx-MacBook-Pro.local:8080/ * 尝试 192.168.1.6... * 连接到 xxx-MacBook-Pro.local (192.168.1.6) 端口 8080 (#0) > 获取/HTTP/1.1 > 主机:xxx-MacBook-Pro.local:8080 > 用户代理:curl/7.43.0 > 接受:*/* >

问题似乎是“gss_init_sec_context() failed: : unknown mech-code 0 for mech unknown”。 curl 看起来可以用 SPNEGO/GSS 正确编译?

curl 7.43.0 (x86_64-apple-darwin14.0) libcurl/7.43.0 SecureTransport zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps     pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz UnixSockets 

编辑:HTTPie (https://github.com/ndzou/httpie-negotiate) 表现出类似的行为。它在第一个服务器响应后停止。 服务器返回带有 401 响应的内容而不仅仅是标头是否重要?

获取/HTTP/1.1 接受: */* 接受编码:gzip,放气 连接:保持活动 主机:192.168.1.6:8080 用户代理:HTTPie/0.9.2 HTTP/1.1 401 未经授权 内容长度:209 内容类型:应用程序/json;字符集=UTF-8 WWW-认证:协商 “错误”: “标题”: “WWW-Authenticate”:“协商” , “原因”:空, “根本原因”: [ “标题”: “WWW-Authenticate”:“协商” , “原因”:空, “类型”:“xxx” ], “类型”:“xxx” , “状态”:401

我怎样才能让 curl 开始工作并使用正确的机甲?

【问题讨论】:

您使用的是什么 GSS-API 实现?显示ldd curl (mac上没有ldd) -> "otool -L /usr/bin/curl" master /usr/bin/curl: /usr/lib/libcurl.4.dylib (兼容版本7.0.0, 当前版本 8.0.0) /usr/lib/libz.1.dylib (兼容版本 1.0.0, 当前版本 1.2.5) /usr/lib/libSystem.B.dylib (兼容版本 1.0.0,当前版本 1213.0.0) 现在有问题。从输出中我看不到使用了什么 GSS-API 实现。请运行krb5-config --version 并显示结果。 $ krb5-config --help --version --> master Kerberos 5 release 1.7-prerelease(但是手册页说 otool -L /System/Library/Frameworks/Kerberos.framework/Versions/ A/Kerberos“海姆达尔”) 1.7?认真的?这是超过6.5岁。这是古老的。为什么输出显示 Heimdal 虽然是 MIT Kerberos?我强烈建议从源代码编译 MIT Kerberos 并将 curl 链接到它。如果可行,您可以进一步调查。 【参考方案1】:

当我没有拥有有效的 kerberos 票证时,我能够重现此行为。

> klist
Credentials cache: API:F8526791-7C98-45B7-87A0-8426165D376A
        Principal: me@DOMAIN.COM

  Issued    Expires    Principal

只要我通过 kinit 命令获得有效票证,身份验证就会按预期进行:

> kinit
> klist
Credentials cache: API:F90F79C6-6343-4462-BCD3-54F146FBDBCD
        Principal: me@DOMAIN.COM

  Issued                Expires               Principal
Sep  6 09:16:50 2016  Sep  6 19:16:50 2016  krbtgt/DOMAIN.COM@DOMAIN.COM

【讨论】:

以上是关于curl 停止协商 SPNEGO - 未知 mech-code 0 for mech unknown的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 curl 协商到不同的域

CentOS PHP curl 无法协商一组可接受的安全参数

协商后跨源 SignalR 连接停止

curl需要未知的librasolv.so.2

curl:未知错误(0x80092012)-吊销功能无法检查证书的吊销

curl: (35) 首次请求时连接出现未知 SSL 协议错误