【问题标题】:libcurl SSL connect errorlibcurl SSL 连接错误
【发布时间】:2017-10-08 12:06:22
【问题描述】:

我有一个奇怪的情况,使用 libcurlGET 请求在 Windows 上有效,但在 OSX 上出现证书错误(“ SSL 对等握手失败,服务器很可能需要客户端证书才能连接")

奇怪的是,如果我在终端中使用 curl(仍在 OSX 上)尝试相同的请求,它可以正常工作。

我使用的唯一与 SSL 相关的选项是

curl_easy_setopt(curlHandle, CURLOPT_SSL_VERIFYPEER, 0);
curl_easy_setopt(curlHandle, CURLOPT_SSL_VERIFYHOST, 0);

如何解决这个问题?

Win7 curl version: 7.46
OSX Sierra curl version: 7:54

【问题讨论】:

  • 获取 windows 使用的任何证书包,并将其复制到 OSX 并告诉 curl 将其与 CURLOPT_CAINFO 一起使用?尽管您很可能会使用此 1:curl.haxx.se/docs/caextract.html
  • @hanshenrik 和应用程序的用户也必须这样做?这对我来说似乎不合适
  • 不,您可以随应用程序一起提供适当的证书包。
  • 但是如果是证书问题,为什么使用 curl 可以工作?
  • 最佳猜测:您的 Windows 系统安装了 libcurl 读取的默认证书包,而您的 OSX 系统没有

标签: macos curl libcurl


【解决方案1】:

尝试使用来自 OS X bash 的curl,使用详细输出 (-v)。正如verbose section 中的文档所说,它应该为您提供有关正在使用的 CA cURL 的信息:

如果我们使用 HTTPS:// URL 而不是 HTTP 的 URL,还会有一大堆行解释 curl 如何使用 CA 证书来验证服务器的证书以及服务器证书的一些细节等。包括哪些已选择密码和更多 TLS 详细信息。

编辑:here 是我在“限制”下的评论的解释:

DarwinSSL:如果验证值为 0,则 SNI 也被禁用。 SNI 是一个将主机名发送到服务器的 TLS 扩展。服务器可以使用该信息来执行诸如发回主机名的特定证书或将请求转发到特定源服务器等事情。如果未发送 SNI,某些主机名可能无法访问。

这里的问题是 cURL 在 OS X 上使用 DarwinSSL,当 CURLOPT_SSL_VERIFYHOST 设置为 0 时,它对某些主机名有限制。尝试在不禁用这两个选项的情况下发送请求。

【讨论】:

  • 这是我得到的输出 pastebin.com/jb3mELjH 。哪个是客户端证书?
  • 我看了一下 curl 源码。这是引发您遇到的错误的代码 sn-p 。 github.com/curl/curl/blob/master/lib/vtls/darwinssl.c#L2326您是否尝试过注释掉您在问题中显示的两行?也许您明确告诉 curl 不要验证主机和对等方,这不受 DarwinSSL 支持,DarwinSSL 是基于达尔文的操作系统的 TLS 实现。尝试不禁用验证。
  • 这个限制是由 DarwinSSL 的 API 造成的,所以 curl 不能做很多事情......
猜你喜欢
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 2011-03-18
  • 2014-02-06
  • 2018-08-16
  • 1970-01-01
  • 2016-05-07
  • 2016-06-30
相关资源
最近更新 更多