2017-10-08 153 views
0

我有一个奇怪的情况,即开始使用libcurl的在Windows上运行请求,但给出了OSX证书错误(” SSL同行握手失败,服务器最有可能需要客户端证书连接“)libcurl的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 
+0

采取任何证书包窗口使用,并将其复制到OSX并告诉curl使用它与CURLOPT_CAINFO?尽管你很可能使用这个1:https://curl.haxx.se/docs/caextract.html – hanshenrik

+0

@hanshenrik,并且应用程序的用户也必须这样做?这对我来说看起来并不正确 – user1233963

+0

不,不然,您可以随应用程序发送适当的证书包。 – hanshenrik

回答

1

尝试使用详细输出-v)使用curl从OS X的bash。它应该给你关于CA卷曲信息使用,如文档中说verbose section

如果我们使用HTTPS:// URL,而不是HTTP之一,也将有线条的一大堆解释卷曲如何使用CA证书来验证服务器的证书以及服务器证书中的一些细节等。包括选择哪些密码和更多TLS细节。

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

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

这里的问题是,卷曲使用DarwinSSL为OS X,当CURLOPT_SSL_VERIFYHOST设置为0尝试发送请求,而不禁用这两个OPTS其中有一些主机名的限制。

+0

这是我得到的输出https://pastebin.com/jb3mELjH。哪一个是客户端证书? – user1233963

+0

我看了一下卷曲源。这是引发错误的代码片段。 https://github.com/curl/curl/blob/master/lib/vtls/darwinssl.c#L2326 您是否尝试过评论您在问题中显示的两条线?也许你明确地告诉curl不要验证host和peer,DarwinSSL不支持DarwinSSL,这是基于Darwin的OS的TLS实现。 尝试不禁用验证。 – NoImaginationGuy

+0

该限制是由DarwinSSL的API引起的,因此卷曲可以做很多事情...... –