【发布时间】:2018-03-06 09:08:11
【问题描述】:
我正在尝试使用 libcurl 从本地 https 服务器下载文件。 但是,它没有这样做,我不确定如何调试它? perror 没有设置任何东西。此外,我正在使用的本地 https 服务器正在使用 - openssl - 2048 位。这是使用以下命令生成的。
openssl req -x509 -newkey rsa:2048 -nodes -keyout key.pem -out cert.pem -days 365
这是我的 C 代码。我在 linux 上运行这个 - C
#include <openssl/err.h>
#include <openssl/ssl.h>
#include <curl/curl.h>
#include <stdio.h>
size_t writefunction(void *ptr, size_t size, size_t nmemb, void *stream)
{
printf("called.. writeFunction\r\n");
fwrite(ptr, size, nmemb, (FILE *)stream);
return (nmemb*size);
}
int main(void)
{
CURL *ch;
CURLcode rv;
char caPath[128];
char errbuf[CURL_ERROR_SIZE];
rv = curl_global_init(CURL_GLOBAL_ALL);
ch = curl_easy_init();
rv = curl_easy_setopt(ch, CURLOPT_URL, "https://110.166.10.296:9000/test.conf");
/* provide a buffer to store errors in */
curl_easy_setopt(ch, CURLOPT_ERRORBUFFER, errbuf);
/* provide a buffer to store errors in */
curl_easy_setopt(ch, CURLOPT_ERRORBUFFER, errbuf);
rv = curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, *writefunction);
rv = curl_easy_setopt(ch, CURLOPT_WRITEDATA, stdout);
rv = curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 1L);
printf("set Up CA Path..\r\n");
memset(caPath,'0',sizeof(caPath));
strcpy(caPath,"/home/test/SSL_Server");
rv = curl_easy_setopt(ch, CURLOPT_CAPATH,caPath);
rv = curl_easy_perform(ch);
printf("curl easy perform done..\r\n");
if(rv == CURLE_OK)
printf("*** transfer succeeded ***\n");
else
{
printf("*** transfer failed..****\n");
perror("failed:");
/* if the request did not complete correctly, show the error
information. if no detailed error information was written to errbuf
show the more generic information from curl_easy_strerror instead.
*/
size_t len = strlen(errbuf);
fprintf(stderr, "\nlibcurl: (%d) ", rv);
if(len)
fprintf(stderr, "%s%s", errbuf,
((errbuf[len - 1] != '\n') ? "\n" : ""));
else
fprintf(stderr, "%s\n", curl_easy_strerror(rv));
}
return 0;
}
编译——
gcc curl.c -o curl.out -lcurl
O/p -
./curl.out
set Up CA Path..
curl easy perform done..
*** transfer failed..****
libcurl: (60) SSL certificate problem: self signed certificate
【问题讨论】:
-
您似乎忽略了 curl_easy_perform() 调用返回的状态。根据curl.haxx.se/libcurl/c/curl_easy_perform.html,这将使您对问题所在有一个很好的了解。
-
此外,您可以将 curl_easy_setopt() 与 CURL_ERRORBUFFER 一起使用(请参阅example 了解如何使用它)来确定 curl 发现的错误。
-
我正在使用它从使用 openssl 的自签名证书中下载文件。
-
更新了我的代码,现在看到了真正的问题 - SSL 证书问题:自签名证书。知道我应该在这里做什么吗?