2013-03-19 62 views
3

我目前使用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永遠不會被髮送?

+0

你比較了你的程序用'curl'發送的請求頭嗎? – 2013-03-19 08:52:35

+0

是的,我提供了他們在我的編輯(這是我想到的第一件事)。 – 2013-03-19 09:09:23

+1

嘗試在程序中發送一些用戶代理字符串,並告訴curl不要發送任何('-A''')並查看會發生什麼。 – 2013-03-19 09:13:54

回答

2

好吧,我終於得到它的工作,通過納米一些指針後,這裏也有掙扎,有我終於得到了一個工作代碼: -

using namespace std; 

#include "stdafx.h" 
#include <stdio.h> 
#include <curl.h> 

#define YOUR_URL "http://invr28ppqa24:8080/examples" 
#define ANYUSER "" 
#define ANYPWD "" 

int main(int argc, char* argv[]) 
{ 
//__asm int 3; 

//initialize a curl object 
CURLcode result; 
int x; 
CURL* curl = curl_easy_init();     //initialize a easy curl handle 
if(curl){ 
    curl_easy_setopt(curl,CURLOPT_USERNAME, ANYUSER);      //set second option to enable anyuser, a trick necessary for program to work 
    curl_easy_setopt(curl,CURLOPT_USERNAME, ANYPWD); 
    curl_easy_setopt(curl,CURLOPT_VERBOSE, 1); 
    curl_easy_setopt(curl, CURLOPT_URL,YOUR_URL); 
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, "false"); 
    curl_easy_setopt(curl, CURLOPT_USERAGENT, "curl/7.19.6 (i386-pc-win32) libcurl/7.19.6 OpenSSL/0.9.8k");  
    curl_easy_setopt(curl,CURLOPT_HTTPAUTH, CURLAUTH_GSSNEGOTIATE);   //set first option to enable gssnegotiate authentication 
    curl_easy_perform(curl); 
    //curl_easy_cleanup(curl); 
    scanf("%d", &x);       //last statement used to get delay in demo situations 
} 
return 0; 

}

302仍然來了,我有手動設置useragent(不那麼優雅)。由於跟蹤地點,問題主要解決。謝謝。

最初的302錯誤仍然存​​在,並且沒有得到答覆。

相關問題