【发布时间】:2017-03-16 10:02:18
【问题描述】:
我正在使用 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);from curl docs
和
获得更好/不同/更新的 CA 证书包!一种选择是通过在 curl 构建树根目录中运行“make ca-bundle”来提取最近 Firefox 浏览器使用的版本,或者可能下载以这种方式为您生成的版本。 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,并且似乎可以正常工作。对我来说,这感觉比使用应用程序安装捆绑包要好一些。
Edit2: 虽然已解决,但似乎 ca-certificates 包有时不会安装 ca-certificates.crt 而是 ca-bundle.crt 并且位置在不同发行版上有所不同,如 this source, happyassassin.net 所示不同的 Linux 系统将 CA 包存储在不同的位置。对于如何处理,似乎没有明确的答案。我应该在配置文件中使用用户可以修改的值,还是对这个主题有任何其他想法?
Edit3: 一些用户指出我的名字存在于 curl 寻找的路径之一中,我不完全确定这如何可能是我为 curl 指定的唯一内容是我建立 openssl/cares 库的地方...
我意识到这是一个加载/多部分问题,但它与标题所述的主题相同,我将不胜感激。
谢谢。
【问题讨论】: