使用C++/libcurl/openssl实现应用程序的安全服务器通信

8
我正在开发一个用C++编写的应用程序(跨平台;Windows、Mac和Linux),需要使用libcurl以https协议与服务器进行安全通信 (在Windows/Mac/Linux上分别使用winssl/darwinssl/openssl构建) 。我已经更改了一个curl选项CURLOPT_SSL_VERIFYPEER,将其从0更改为1,这应该有助于防止中间人攻击问题。
这导致了一些问题,初步搜索指出,需要关闭该选项,但是在进一步调查后,我发现:

获取一个可以验证远程服务器的CA证书,并使用正确的选项指向此CA证书以进行连接验证。对于libcurl黑客:curl_easy_setopt(curl, CURLOPT_CAPATH, capath);来自curl文档

获取更好/不同/更新的CA证书包!一种选项是通过在curl构建树根目录中运行“make ca-bundle”来提取最近Firefox浏览器使用的证书。或者可能下载以这种方式为您生成的版本。来自curl文档

我实际上使用CURLOPT_CAINFO将包全部下载并使用,因为我看到有人在Windows上使用CURLOPT_CAPATH时遇到了一些问题;curl文档。我已经在Windows和Mac上下载和安装了此捆绑包,并想知道这是否是正确的方法,或者是否有更好的做法。
最初,这导致了应用程序运行在某些公司网络或代理后的用户出现问题,通过在Windows上使用winssl而不是openssl构建libcurl似乎修复了此问题;尽管可能伪装成防火墙问题,但仍不清楚,尽管看起来很有可能。抱歉让您阅读的内容很多。ca-cert-bundle.crt与应用程序一起安装,是否有什么愚蠢之处,以及是否需要采用不同的方法从已安装的应用程序与服务器进行安全通信?
一个稍微独立但仍然非常相关的问题是,在Linux上使用CURLOPT_CAINFO会给出错误信息:

error setting certificate verify locations: CAfile: ../share/my_application/curl-ca-bundle.crt CApath: none

尝试从应用程序中打开文件以进行读取确实成功。 编辑:我通过在Linux上不设置CURLOPT_CAINFO字段(将其留空)并向应用程序包添加依赖项包ca-certificates来解决了此问题。默认路径正确地是/etc/ssl/certs/ca-certificates.crt,而且似乎可行。对于而言,这比安装捆绑包更好。

编辑2:虽然已解决,但似乎ca-certificates包有时不会安装ca-certificates.crt,而是ca-bundle.crt,并且不同的发行版存储CA Bundle的位置不同,如此源,happyassassin.net显示。它似乎没有明确的答案来处理这个问题。我应该在配置文件中使用用户可以修改的值,还是对此有其他想法?

编辑3:一些用户指出我的名字存在于curl寻找的路径之一,我不确定如何可能,因为我为curl指定的唯一内容是我构建的openssl/cares库的位置...

我意识到这是一个复杂的/多部分问题,但它与标题所述的主题有关,感激任何帮助。

谢谢。

2个回答

0

我目前在Windows上使用WinSSL,但我的初始方法与您提供的superuser链接相同,将CA捆绑包与应用程序一起发布,我感到有些奇怪/是-这也导致在企业网络上出现错误;这些错误似乎已经消失了,或者由于WinSSL更改而变成DNS /防火墙问题。在Linux上,您提供的链接显示了Redhat和类似发行版的特定位置,但在Debian / Ubuntu上,ca-certificates软件包似乎将它们放置在不同的位置,因此将CAPATH设置为一个位置将错过另一个。 - Tim Beaudet
可能你应该将其留空,这样它就会采用默认的CA路径。但是,在某些发行版中它可能无法正常工作(网络上有一些错误报告)。因此,您需要在不同版本上进行一些测试,并相应地使用路径... - Anardael
实际上我在Linux上没有指定CA路径,所以这应该是正在发生的事情,我知道我的最后一条评论让它看起来像我设置了它,抱歉我只是想说在一个地方使用该选项可能有效但在另一个地方不行。 - Tim Beaudet

0

默认的libcurl构建设置为尝试使用“正确”的CA捆绑包。

Linux

在Linux上构建的libcurl将扫描和检查您系统上的CA存储位置并使用它。如果您在常规Linux发行版上安装了libcurl,则应该已经构建为使用发行版的“典型”CA存储。

macOS

如果您为mac构建libcurl并告诉它使用Secure Transport后端,它将自动使用macOS CA存储。默认安装的来自Apple的curl和libcurl也会这样做。

Windows

如果您构建用于Windows的libcurl以使用Schannel(Windows TLS系统),则默认情况下将使用Windows CA存储。

其他设置

如果您偏离这些设置,基本上选择不使用您正在使用的操作系统中捆绑的CA存储。然后,您需要自己处理和更新CA存储。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接