【问题标题】:LibCurl HTTPS credentials, sequence internally handled?LibCurl HTTPS 凭据,内部处理的序列?
【发布时间】:2011-02-28 21:59:42
【问题描述】:

希望有人可以为我回答这个问题,因为我正在用头撞墙。我正在使用 LibCurl 将简单的文件发布到 HTTPS URL。总的来说,它可以工作,但是联系接收帖子的网站,他们显然已经解决了一个问题,我就是不明白。

显然,我准备了我的请求,输入 URL,提供站点的用户名和密码。然后帖子包含一个 CURL_FORMADD(用于通过多部分表单添加单个文件附件的参数)。

我在计算 CURLOPT_SSL_VERIFYPEER 和 CURLOPT_SSL_VERIFYHOST 时遇到问题,最后通过以下设置让它工作。

curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false );
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1);

这就是问题所在。显然,当我发出 curl_easy_perform() 时,它会尝试发送请求,响应回来并说...向我发送证书信息,然后显然重新提交带有证书信息的整个包。然后被我发送到的服务器接受。

那么,我怎样才能告诉 LibCurl 提交所有内容...用户、密码和证书凭证都预先提交,这样我发送到的服务器不会拒绝第一个请求,只是为了在后续周期获取凭证。

谢谢。

---- 通过反馈进行编辑。

在研究 Eugen 提到的更多内容时...

我已经从其他读数中禁用了“CURLOPT_SSL_VERIFYPEER”,这样做可以打开一个“中间人”妥协的事务。我不想要那个。通过找到认证方法,它是BASIC,所以当我发出连接时,我正在发送

curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC );

现在,它返回 CURLE_SSL_CONNECT_ERROR。我正在尝试获取 sdterror,但它正在崩溃...

FILE  *pLocalFile;
if( fopen_s( &pLocalFile, "MyHTTPS.Log", "w" ))
    return -1;

curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L ); 
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteFileCallback ); 
curl_easy_setopt(curl, CURLOPT_STDERR, pLocalFile ); 

执行完后,我发现 DLL 引发了异常。所以,我什至看不到连接失败是怎么回事……我强烈怀疑是证书。

【问题讨论】:

  • 网站使用什么样的身份验证(基本、NTLM、自定义 cookie 等)?我问的原因是,libcurl 可能首先试图弄清楚服务器支持哪些身份验证方法 - 所以它会在不发送用户/密码的情况下执行一个简单的请求 - 然后它会从 401 回复中找出可用的内容。虽然 SSL 部分让事情有点混乱......
  • @Eugen Constantin Dinca,它的证书是我所知道的,我想我会在早上与我的主管核实。
  • @Eugen Constantin Dinca,这是基本身份验证,所以我想我现在要提供证书信息了...
  • 需要澄清一些事情:因为看起来您正在通过 HTTPS,所以发生的第一件事就是 SSL 握手。此时没有发送用户、密码或表单数据。在握手期间,您不需要根据根 CA 存储 (CURLOPT_SSL_VERIFYPEER=0) 验证服务器的证书链,您只关心主机名是否与证书的 CN (CURLOPT_SSL_VERIFYHOST=1) 匹配。握手完成后,您可以发送用户、密码和表单数据。
  • 没有办法跳过 SSL 握手(至少在建立安全连接之前),所以跳过获取服务器的证书并直接发送用户、密码和表单数据。您是否将 CURLOPT_HTTPAUTH 选项设置为 CURLAUTH_BASIC(或任何其他值)?否则 libcurl 可能会这样发送请求,并从 401 回复中找出服务器想要什么样的身份验证(因此它发送请求两次,没有和使用 USER,PASSWORD)。

标签: c++ ssl libcurl credentials


【解决方案1】:

你需要把事情分开来使解决这个问题更容易。

首先你修复你的 SSL 连接/握手,这样你就不会遇到任何 SSL 相关的问题或错误。

然后,您确保提供必要的 HTTP 身份验证内容并设置基本信息,并且您应该只需要执行一个 HTTP 请求即可获得正确的响应(假设这确实是服务器想要的)。

“DLL 导致异常”似乎是第三个问题,并且独立于其他问题。很难说出您为什么会这样,因为我们无法全面了解您在做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    相关资源
    最近更新 更多