如何解决C ++ libcurl和SSL设置https读取文件
对于我的桌面软件(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,CURLUSESSL_ALL);
时,由于验证失败(需要某种认证),所以我无法连接至https站点;当我转到CURLOPT_SSL_VERIFYPEER
时,我可以连接至https,现在的问题是:
- 此SSL设置(按我提供的代码)是否足够安全以进行读取 文件?
- 当我使用此SSL设置时,它是否增加了一些安全性?
- 当我使用此简单的读取文件代码时是否需要SSL安全性 https?
解决方法
禁用SSL证书验证可让您在中间攻击中陷入困境。它只会为被动拦截您的通信的人加密流量。要么获得商业可验证的证书,要么免费获得“让我们加密”的证书,要么获得您明确信任使用的CA的自签名证书。
在注释中来回移动后,似乎您的curl缺少其根CA捆绑包。该捆绑包用于验证所有SSL证书。从libcurl软件包中获取curl-ca-bundle.crt
,并将其放在程序旁边。在curl可以将其用作证书束之前,您可能需要设置CURLOPT_CAINFO option指向该文件。
关于最后一个问题,这取决于您的威胁模型。 MitM攻击允许以下所有操作:
- 您能接受别人拦截文件内容吗? (机密)
- 您的程序可以对文件进行任意更改吗? (文件损坏,重播攻击和可能的利用)
- 您的程序可以在任意大文件中生存吗? (DoS)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。