我目前使用libcurl(version 7.19.6 built with SPNEGO and GSS-Negotiate support)
編寫客戶端(C++/C),該客戶端連接到Tomcat服務器後面的受保護網頁(受保護的Kerberos
)。使用命令行: -無法獲得協商身份驗證以在libcurl程序中工作
curl --negotiate -u: http://prtotectedpage.jsp --verbose
這工作(服務器返回一個HTTP 401未授權的,然後它允許傳遞和處理SPNEGO
令牌,我可以訪問受保護的頁面)。
然而,當我寫了下面的代碼,並嘗試: -
using namespace std;
#include <stdio.h>
#include <curl.h>
#define YOUR_URL "http://protectedpage.jsp"
#define ANYUSER ""
int main(int argc, char* argv[])
{
__asm int 3; //a debugging thing
//initialize a curl object
CURLcode result;
int x;
CURL* curl = curl_easy_init();
if(curl){
curl_easy_setopt(curl,CURLOPT_HTTPAUTH, CURLAUTH_GSSNEGOTIATE);
curl_easy_setopt(curl,CURLOPT_USERNAME, ANYUSER);
curl_easy_setopt(curl,CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl, CURLOPT_URL,YOUR_URL);
curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
return 0;
}
我拿到後初始連接(錯誤302)從服務器響應對應於頁被臨時移動。
有誰知道這可能會發生。
一些其他配置信息 (KDC = Windows Active Directory in Windows server 2008
),
curl version(7.19.6)
和
IDE = (Microsoft visual studio)
好,我做得更多一點與Wireshark的調查,我發現他們最初的請求之間存在以下差異: -
對於命令行1(即成功的): -
GET /protected.jsp HTTP 1.1 \r\n
Host : somecomputername
User Agent: curl(7.19.6) (ipc-386-win32) libcurl/7.19.16 OPENSSL/0.9.8K \r\n
Accept */*\r\n
Full request: [http://somecomputername/protected.jsp]
而對於客戶端代碼(一個我寫的和失敗的): -
GET /protected.jsp HTTP 1.1 \r\n
Host : somecomputername
Accept */*\r\n
Full request: [http://somecomputername/protected.jsp]
這將意味着用戶代理未在節目中通過。我仍然在尋找到它和一些投入,將不勝感激
第二個編輯: - 我對雙方的詳細輸出取得的觀察: -
對於命令行版本(工作一個) -
> GET /examples/ HTTP/1.1
> User-Agent: curl/7.19.6 (i386-pc-win32) libcurl/7.19.6 OpenSSL/0.9.8k
> Host: somecomputer
> Accept: */*
而對於非工作之一(客戶端代碼我寫的): -
> GET /examples HTTP/1.1
Authorization: Basic RGt1bUByMTIzOg==
User-Agent: curl/7.19.6 (i386-pc-win32) libcurl/7.19.6 OpenSSL/0.9.8k
Host: somecomputer
Accept: */*
這兩個是各自的.exe文件的輸出的前幾行。現在我注意到了兩件事。一個失敗的人默認進入Basic。兩個(這一個更令人不安),Useragent中的箭頭(>)和失敗的一箇中的主機線。這是否意味着useragent永遠不會被髮送?
你比較了你的程序用'curl'發送的請求頭嗎? – 2013-03-19 08:52:35
是的,我提供了他們在我的編輯(這是我想到的第一件事)。 – 2013-03-19 09:09:23
嘗試在程序中發送一些用戶代理字符串,並告訴curl不要發送任何('-A''')並查看會發生什麼。 – 2013-03-19 09:13:54