通过cURL与NTLM进行代理身份验证即使使用正确的凭据也会返回407

时间:2015-05-29 17:36:10

标签: c++ c curl proxy ntlm

我尝试使用使用NTLM身份验证的代理访问服务器。 问题是,即使我提供了正确的凭据(我已经使用Firefox和代理,端口,用户名和密码进行了测试)我收到407(代理需要身份验证)。

我尝试过使用CURLAUTH_NTLM,CURLAUTH_NTLM以及两者的逻辑组合,但仍然没有。

我使用的是最新版本的cURL(7.42.1)和最新版本的openSSL(1.0.2)。

有谁能告诉我我做错了什么?

这是我的C / C +++代码:

int _main()
{
    CURL *hCurl;    
    CURLcode curlCode;

    char username[] = "domain\\user";
    char password[] = "pass";
    char proxy[] = "myproxy:8080";
    char url[] = "http://some_random_url.com";

    hCurl = curl_easy_init();
    if(hCurl) 
    {
        curl_easy_setopt(hCurl, CURLOPT_URL, url);

        curlCode = curl_easy_setopt(hCurl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
        curlCode = curl_easy_setopt(hCurl, CURLOPT_PROXY, proxy);
        curlCode = curl_easy_setopt(hCurl, CURLOPT_HTTPAUTH,  /*CURLAUTH_BASIC | */CURLAUTH_NTLM);
        curlCode = curl_easy_setopt(hCurl, CURLOPT_PROXYUSERNAME, username);
        curlCode = curl_easy_setopt(hCurl, CURLOPT_PROXYPASSWORD, password);

        while(true)
        {
            curlCode = curl_easy_perform(hCurl);
            /* Check for errors */ 
            if(curlCode != CURLE_OK)
                fprintf(stderr, "curl_easy_perform() failed: %s\n",
                curl_easy_strerror(curlCode));

            Sleep(3000);
        }

        curl_easy_cleanup(hCurl);
    }

    getchar();
    return 0;

}

1 个答案:

答案 0 :(得分:1)

阅读文档。 CURLOPT_HTTPAUTH设置用于远程HTTP服务器的凭据,而不是代理:

  

传递一个long参数(设置为位掩码),告诉libcurl您希望它使用哪种身份验证方法与远程服务器通话

     

...使用CURLOPT_USERPWD选项或CURLOPT_USERNAME和CURLOPT_PASSWORD选项设置实际名称和密码。

     

...

     

要使用代理进行身份验证,请参阅CURLOPT_PROXYAUTH

使用CURLOPT_PROXYAUTH指定代理身份验证方法(NTLM),并使用CURLOPT_PROXYUSERPWD设置代理凭据。