4

私は現在、Tomcat サーバーの背後にある保護libcurl(version 7.19.6 built with SPNEGO and GSS-Negotiate support)された Web ページ (保護) に接続するクライアント (C++/C) を作成するために使用しています。Kerberosコマンドラインの使用:-

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]

これは、ユーザー エージェントがプログラムに渡されないことを意味します。私はまだそれを調べており、いくつかの情報をいただければ幸いです

2番目の編集:-両方の詳細な出力について観察しました:-

コマンドライン版(動作版)の場合 -

> 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 ファイルの出力の最初の数行です。今、私は2つのことに気づきました。失敗したものは、デフォルトで Basic になります。2 つ (これはもっと気がかりです)、Useragent 行に矢印 (>) がなく、失敗した行にホスト行があります。これは、ユーザーエージェントが送信されないことを意味しますか?

4

1 に答える 1

3

さて、私はついにそれを動作させることができました。nmによるいくつかのポインタと、あちこちで苦労した後、私はついに動作するコードを取得しました:-

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はまだ来ており、ユーザーエージェントを手動で設定する必要があります(それほどエレガントではありません)。フォローロケーションのため、問題は主に解決されました。ありがとう。

最初の302エラーはまだ存在し、未回答のままです。

于 2013-03-19T09:56:34.263 に答える