繁体   English   中英

使用C ++ / libcurl / openssl从应用程序进行安全服务器通信

[英]Secure Server Communication from application using C++/libcurl/openssl

我正在开发C ++应用程序(跨平台; Windows,Mac和Linux),需要使用带有libcurl的https协议与服务器进行安全通信(分别在Windows / Mac / Linux上使用winssl / darwinssl / openssl构建) 我已经将curl选项CURLOPT_SSL_VERIFYPEER0更改为1 ,这有助于防止MitM问题。

这导致了初始搜索指向关闭该选项的问题,但在深入挖掘后我发现:

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

获得更好/不同/更新的CA证书捆绑! 一种选择是通过在curl构建树根中运行'make ca-bundle'来提取最近Firefox浏览器使用的那个,或者可能下载以这种方式为您生成的版本。 来自curl docs

我实际上使用CURLOPT_CAINFO到捆绑包,因为我在Windows上使用CURLOPT_CAPATH看到了一些问题; 卷曲文档 我已经下载并安装了这个捆绑软件以及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和位置因不同的发行版而异,因为这个来源,happyassassin.net显示不同的Linux系统存储CA捆绑在不同的位置。 对于如何处理这个问题似乎没有明确的答案。 我是否应该在配置文件中使用用户可以修改的值,或者有关该主题的任何其他想法?

Edit3:有些用户指出我的名字存在于curl查找的路径之一中,我不完全确定这是怎么可能的,因为我为curl指定的唯一内容是我构建openssl / cares库的地方。 。

我意识到这是一个加载/多部分问题,但它与标题所述的主题相同,我会感激任何帮助。

谢谢。

在我看来,最好使用系统证书,然后将证书与应用程序打包在一起(如果您没有使用某些特殊证书)。 对于linux来说,根据https://serverfault.com/questions/394815/how-to-update-curl-ca-bundle-on-redhat应该很容易。对于Windows,您可以使用winssl或从系统创建文件https://superuser.com/questions/442793/why-cant-curl-properly-verify-a-certificate-on-windows 配置cURL以使用默认系统证书存储区

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

Linux的

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

苹果系统

如果您为mac构建libcurl并告诉它使用安全传输后端,它将自动使用macOS CA存储。 因此,与Apple捆绑的macOS捆绑的默认安装curl和libcurls也是如此。

视窗

如果为Windows构建libcurl以使用Schannel(Windows TLS系统),它将默认使用Windows CA存储。

其他设置

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM