【问题标题】:c++ libcurl and SSL setup for https read filec++ libcurl和SSL设置https读取文件
【发布时间】:2020-09-04 09:24:13
【问题描述】:

对于我的桌面软件(Windows 7 - 10),我使用服务器上的读取文件检查版本并从中获取信息(读取 txt 文件)。这已经完成,但我不确定我是否使用 SSL 正确设置以及是否需要为那个简单的事情提供安全性(我不确定 SSL 是如何工作的,我使用了 libcurl 示例中的一些示例)。我只读取txt文件并获取信息(程序版本),仅此而已。

也许值得一提的是,我使用来自 Windows 的 libcurl 下载站点的二进制文件(curl 项目的二进制文件)。

这是我如何使用 libcurl 的部分代码:

std::stringstream isf;
CURL *curl;
CURLcode res;
/* CURL functions are function pointers because I load libcurl manually (LoadLibrary()) */
curl = curlEasyInit();
if (curl)
{
    curlEasySetOpt(curl, CURLOPT_URL, "https://example.com/MyFile.txt");
    curlEasySetOpt(curl, CURLOPT_WRITEFUNCTION, my_read_stream);
    curlEasySetOpt(curl, CURLOPT_WRITEDATA, &isf);

    // ------------------------------------------------------------------------------------------
    // *** Question below ***
    curlEasySetOpt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL);
    curlEasySetOpt(curl, CURLOPT_SSL_VERIFYPEER, 0L); // this is needed if I use CURLOPT_USE_SSL othervise it is unable to connect to https if I use CURLOPT_USE_SSL
    // ------------------------------------------------------------------------------------------

    res = curlEasyPerform(curl);
    // ...
    curlEasyCleanup(curl);
    curlGlobalCleanup();
    curl_easy_cleanup(curl);
}

size_t my_read_stream(void * buffer, size_t size, size_t nmemb, void * stream)
{
    bool ok = false;
    size_t b;
    try {
        std::stringstream * fs = static_cast<std::stringstream *>(stream);
        b = size * nmemb;
        fs->write(static_cast<char*>(buffer), b);
        ok = true;
    }
    catch (std::exception e)
    {
        std::cout << "ERROR READ STREAM : " << e.what() << std::endl;
    }

    if (ok)
    {
        return b;
    }
    else
    {
        b = size * nmemb;
        return b;
    }
}

问题:

我能够连接https://example.com/MyFile.txt 并在没有 SSL 设置的情况下读取文件(请参阅用注释封装的代码)。当我使用 curlEasySetOpt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL); 时,我无法连接到 https 站点,因为验证失败(需要一些认证),当我打开 CURLOPT_SSL_VERIFYPEER 时,我能够连接到 https,现在问题是:

  1. 此 SSL 设置(在我提供的代码中)是否足够安全以供读取 文件?
  2. 当我使用此 SSL 设置时,它会增加一些安全性吗?
  3. 这个简单的读取文件代码是否需要 SSL 安全性,当我使用 https?

【问题讨论】:

    标签: c++ windows ssl https libcurl


    【解决方案1】:

    禁用 SSL 证书验证会使您面临中间人/怪物的攻击。它只为被动拦截您的通信的人加密流量。获取商业可验证证书、Let's encrypt 提供的免费证书或您明确信任所使用 CA 的自签名证书。

    在 cmets 中来回切换后,您的 curl 似乎缺少其根 CA 包。此捆绑包用于验证所有 SSL 证书。从 libcurl 包中取出 curl-ca-bundle.crt 并将其放在您的程序旁边。您可能需要将 CURLOPT_CAINFO option 设置为指向该文件,然后 curl 才能将其用作证书包。

    至于最后一个问题,这取决于您的威胁模型。中间人攻击允许以下所有情况:

    • 你同意别人截取文件的内容吗? (保密)
    • 您的程序能否在对文件的任意更改中幸存下来? (文件损坏、重放攻击和可能的漏洞利用)
    • 您的程序可以保存任意大的文件吗? (DoS)

    【讨论】:

    • 我在我的网站上使用 LetsEncrypt。我不确定它是如何工作的,但我的主机会自动提供它,因此我不确定我是否理解,但我如何获得该证书(LE)并在 libcurl 中使用它?顺便提一句。我的文件仅包含最新程序版本的数量。这一切,我认为这不是秘密或机密。
    • 如果您的网络服务器配置正确,证书应该被标记为已验证,无需您的努力。
    • 我认为 web 服务器配置正确,在 webbrowser 上使用 https 没有问题。
    • 通过设置CURLOPT_VERBOSE 选项检查发生了什么。
    • 使用那个选项我得到这个错误描述: Trying xx.xxx.xxx.xx:443... Connected to example.com (xx.xxx.xxx.xx) port 443 (#0) ALPN,提供 h2 ALPN,提供 http/1.1 SSL 证书问题:无法获取本地颁发者证书正在关闭连接 0 curl 告诉我们 60
    猜你喜欢
    • 2017-10-26
    • 2011-05-08
    • 2015-08-11
    • 2013-07-19
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多