【发布时间】: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