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

时间:2016-11-02 22:39:42

标签: c++ openssl libcurl

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

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

  

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

  

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

我实际上使用了CURLOPT_CAINFO,因为我在Windows上使用CURLOPT_CAPATH看到了一些问题。 curl docs。我已经下载并安装了这个软件包以及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,似乎正常工作。对于 me ,这比使用应用程序安装捆绑包感觉好一些。

Edit2:虽然解决了,但ca-certificates软件包有时候并没有安装ca-certificates.crt而是ca-bundle.crt,并且不同发行版的位置因{{{ 3}}表明不同的Linux系统将CA包存储在不同的位置。对于如何处理,它似乎没有明确的答案。我是否应该在配置文件中使用用户可以修改的值,或者有关该主题的任何其他想法?

编辑3:有些用户指出我的名字存在于curl寻找的其中一条路径中,我并不完全确定这是怎么可能的,因为我唯一可以做到这一点。为curl指定的是我构建openssl / cares库的地方......

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

感谢。

2 个答案:

答案 0 :(得分:0)

在我看来,最好使用系统证书,然后将证书与应用程序打包在一起(如果您没有使用某些特殊证书)。对于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创建文件Configure cURL to use default system cert store

答案 1 :(得分:0)

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

Linux

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

macOS

如果为Mac构建libcurl并告诉它使用安全传输后端,它将自动使用macOS CA存储。苹果随macOS捆绑提供的默认安装的curl和libcurls也是如此。

Windows

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

其他设置

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