如何修复curl:(60)SSL证书:使用sudo时无效的证书链


12

因此,自从Mavericks升级以来,curl的证书问题更多。

当尝试使用其自签名证书来卷曲我的Web服务器中的文件时,它收到错误“ SSL证书:无效的证书链”。

通过将证书添加到我的系统钥匙串并将其设置为始终允许SSL(我在此处此处找到的信息)来纠正此问题

这可以正常工作,当我卷曲文件时,它可以正确下载。

但是,如果我之前使用sudo运行curl(例如,我有一个需要使用sudo运行并在其中进行卷曲的脚本),那么我会返回相同的错误消息。

我猜想根目录可能不是从系统钥匙串读取的?

有人知道解决此问题的方法吗?

Answers:


17

如果您将CA证书存储在文件系统(PEM格式)中,则可以告诉curl将它们用于

sudo curl --cacert /path/to/cacert.pem ...

您还可以通过以下方式关闭证书验证

sudo curl --insecure ...

编辑:关于反馈的更新

如果要永久设置,则应创建一个.curlrc文件并将其放置在主目录中。sudo命令可能需要使用以下文件:/var/root该文件采用与命令行相同的选项,但不包含破折号。每行一个选项:

cacert=/path/to/my/certs.pem

感谢您的回答,使用sudo运行的脚本来自第三方,因此我无法真正修改curl命令本身。不安全感并不是真正的选择。可以在全球范围内完成吗?
雅各布·汤姆林森,2014年

您可以制作一个.curlrc文件并将其存储在您的主文件夹中,尽管使用sudo可能需要为/var/root/.curlrc。该文件应包含不带破折号的选项,每行一个。因此,“ cacert = / path / to / my / certs.pem”

1
+1用于设置root- .curlrc而不是--insecure。确切地说,对于处于网络位置的攻击者而言,这对于MITM和注入代码而言是微不足道的。
zigg 2014年

谢谢,听起来像我要找的东西。明天我会尝试的,如果可行的话,奖励赏金。
雅各布·汤姆林森2014年

6

根目录不会从当前的用户信任设置中读取,但是有管理员信任设置和特定于根用户的信任设置。(这些也与系统信任设置不同。)另外,请注意,证书信任设置与仅将证书添加到钥匙串有所不同。您可以在不完全添加证书的情况下将其标记为受信任的证书。(我不清楚这里的确切情况,而且我所见过的文档含糊不清。)

您可以将证书标记为当前用户信任的证书

$ security add-trusted-cert /path/to/cert.pem

但这对root没有帮助。您可能现在猜到的解决方案是sudo以上所述的一种,然后将其标记为对根用户特别受信任:

$ sudo security add-trusted-cert /path/to/cert.pem

或使用该-d标志将其添加到管理员信任设置中:

$ security add-trusted-cert -d /path/to/cert.pem

(OS X将弹出一个密码对话框以确认这一步骤。)

后两者中的任何一个似乎都足够sudo curl

参考:https : //developer.apple.com/library/mac/Documentation/Darwin/Reference/ManPages/man1/security.1.html


正如我在问题中所说的,我已经将它们添加到系统钥匙串以及登录钥匙串中了。
雅各布·汤姆林森2014年

您实际上尝试了我的建议吗?我在您描述的确切情况下对其进行了测试,并且可以正常工作。我不清楚所有详细信息-文档模糊不清-但您应该知道证书信任设置与仅将证书添加到钥匙串并不完全是同义词,并且管理证书信任设置与系统和系统分开存在用户设置/钥匙串。(在混合中似乎还存在一组特定于root用户的用户设置。)我已经编辑了答案,以便在这一点上更加清楚。请尝试此解决方案。
Wes Campaigne

是的,当您第一次发布该解决方案时,我曾尝试过此解决方案。证书位于系统钥匙串中,并设置为受信任。仍然没有运气。
雅各布·汤姆林森2014年

5

这实际上是在输出提示中:

echo insecure >> ~/.curlrc

使用上述解决方案的优点是它适用于所有curl命令,但不建议这样做,因为它可能通过连接到不安全且不受信任的主机而引入MITM攻击


2

如果您使用MacPorts(并且您提到的第3方脚本没有将其从中删除$PATH或调用/usr/bin/curl),则可以按此顺序安装certsynccurl端口。

certsync是一个工具和相应的启动plist,它将您的系统钥匙串导出到$prefix/etc/openssl/cert.pem并安装一个符号链接,$prefix/share/curl/curl-ca-bundle.crt -> $prefix/etc/openssl/cert.pem因此MacPorts curl将自动获取证书。certsync更改系统钥匙串时,还将自动更新生成的文件。


谢谢您的帮助,我尽可能避免使用MacPorts。
Jacob Tomlinson


-1

要进行sudo curl工作(在OSX Sierra上),我们必须将证书导入,System.keychain并在那里信任它。这可以在“钥匙串”应用中手动完成,也可以使用以下命令完成:

sudo security add-trusted-cert -d -k /Library/Keychains/System.keychain /path/to/cert.pem

重要的是既要指定-d并手动设置系统钥匙串的路径,-k也要确保证书尚未真正导入到那里。

该命令不带sudo,但可以通过UI对话框询问密码,这可能是脚本的障碍。


我得到了错误SecCertificateCreateFromData: Unknown format in import.
rraallvv

无论谁投票否决,请知道我清楚地写了“在OSX Sierra上”,这对我们来说是一个可行的解决方案。如果它在较新的OSX版本中不起作用,则可能是因为OSX支持或工具已更改。或类似上一个注释程序的问题,其中输入文件的格式不受支持(问题未指定该格式)。
亚历山大·克里姆采切克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.