【问题标题】:RCurl on OS X El Capitan -9806 ErrorOS X El Capitan 上的 RCurl -9806 错误
【发布时间】:2015-12-12 14:38:12
【问题描述】:

我正在尝试使用 RCurl 进行 oauth 2 身份验证。我的代码是:

library(RCurl)
myOpts <- curlOptions(httpheader =  
      c(Accept="application/json",
    "Content-Type"="application/x-www-form-urlencoded"))

token <- postForm(authURL, 
    .params = list(
        client_id ="aaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
        client_secret = "bbbbbbbbbbbbbbbbbbbbbbbbbbbb",
        username = "xxxxx@yyyy.zzz",
        password = pswd), 
    .opts = myOpts, 
    style="POST")

代码在 R/Windows 上运行良好,但在 OS X El Capitan 上却不行。在 OS X 上,我收到错误

Error in function (type, msg, asError = TRUE)  : 
SSLRead() return error -9806

我认为这是 OS X 附带的 curl/libcurl 版本中的 SSL 的问题,并且在其他地方有文档,但我无法找到解决方法。对于它的价值,我对 httr 包有类似的问题。如何更新 curl 并使其与 RCurl 配合得很好?

我的问题与How do I get RCurl to connect to POST SSL on OS X Yosemite? 非常相似,但是 El Capitan 使复制 curl-config 文件变得困难,正如该帖子的答案中所建议的那样。

【问题讨论】:

  • 我对这个问题的答案很感兴趣。
  • 我已经删除了我的未回答,但我必须指出,您的示例仍然不足以允许复制错误。

标签: r macos curl rcurl httr


【解决方案1】:

您没有说明您正在使用哪个版本的 R 或 libcurl 或它们是如何安装的,因此您的问题的完整答案可能需要花费几页来涵盖所有可能的变化。 El Capitan 改变了安全设计。谷歌搜索“rootless el capitan”或“el capitan 系统完整性保护”。大多数/usr/ 现在默认锁定,/usr/local/ 除外。这是possible to temporarily disable that feature,但在您这样做之前,我建议您检查一下自制软件是否已更新以适应此更改。 (我认为它可能一直在使用/usr/local/。)我还将确保您了解自制软件安装过程与 R 的 OSX 分支的维护者所期望的不同。

为了比较的目的,我确实有一个正常的 RCurl 安装,来自二进制 if IIRC,安装在 R 3.2.2 的二进制版本中,我的 curl 版本报告看起来像。

machine-name-redacted-mac-pro:~ redacted$ curl --version
curl 7.43.0 (x86_64-apple-darwin15.0) libcurl/7.43.0 SecureTransport zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz UnixSockets 

# and in R
> packageVersion("RCurl") 
[1] ‘1.95.4.7’

> system("which curl")
/usr/bin/curl

【讨论】:

  • 我使用的是 R 3.2.2,我的 curl --version、packageVersion 和哪个 curl 和你的一样。在大多数情况下,RCurl 工作正常——只是 post+SSL 会导致问题。我还应该补充一点,如果安装 homebrew curl 并将编译器指向 homebrew curl-config,我可以使用新的 libcurl 构建和安装 RCurl。但是,我没有做对,因为它会使 R 崩溃。
【解决方案2】:

我得到了以下工作:

  1. 使用通常的 gnu 配置/制作/安装顺序从源代码安装 libressl。
  2. 使用通常的 gnu 配置/制作/安装顺序再次从源安装 curl。在配置步骤中,我需要使用 --with-ca-bundle 选项将配置指向一个有效的证书文件。
  3. 从源代码编译 RCurl 确保 /usr/local/bin 在路径列表中比 /usr/bin 更早,以便 RCurl 的配置脚本从 curl 的新版本而不是 os x 默认版本中找到 curl-config。

我很想知道是否有更好的方法。

【讨论】:

    猜你喜欢
    • 2016-04-29
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多