【问题标题】:how to use libcurl to download file over https - linux , C?如何使用 libcurl 通过 https - linux、C 下载文件?
【发布时间】: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 证书问题:自签名证书。知道我应该在这里做什么吗?

标签: c linux


【解决方案1】:
rv = curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 1L);

此代码正在启用​​ SSL 证书验证,但由于您使用的是自签名证书而失败。将此选项设置为 0 可禁用验证。

【讨论】:

  • 理想情况下,我认为我们应该通过加载自签名证书来进行验证。
猜你喜欢
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 2011-01-22
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
相关资源
最近更新 更多