如何使用libcurl通过https下载文件 - linux,C?

问题描述 投票:-2回答:1

我正在尝试使用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
c linux
1个回答
0
投票
rv = curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 1L);

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

© www.soinside.com 2019 - 2024. All rights reserved.