HTTR包:SSL证书错误,SSL3_GET_SERVER_CERTIFICATE

时间:2015-02-17 08:43:03

标签: r ssl ca

在尝试使用R中的HTTR包和GET()函数时,我遇到了一个挑战:

pg2 = GET("http://httpbin.org/basic-auth/user/passwd", authenticate("user","passwd"))

我收到以下错误:

Error in function (type, msg, asError = TRUE)  : 
  SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

我在网上搜索过,发现我需要使用以下命令行更新.Rprofile文件:

options(RCurlOptions = list(verbose = FALSE, capath = system.file("CurlSSL", "cacert.pem", package = "RCurl"), ssl.verifypeer = FALSE))

但它仍然没有工作,我一直收到同样的错误信息。

当我尝试下面的代码时

> HEAD("https://www.google.com", verbose())
  • 即将连接()到www.google.com端口443(#0)
  • 尝试173.194.32.211 ... *已连接
  • 已连接至www.google.com(173.194.32.211)端口443(#0)
  • 成功设置证书验证位置:
  • CAfile:C:/Users/malek.safa/Documents/R/win-library/3.0/httr/cacert.pem CApath:无
  • SSL证书问题,验证CA证书是否正常。细节: 错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败
  • 关闭连接#0 函数错误(type,msg,asError = TRUE): SSL证书问题,验证CA证书是否正常。细节: 错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败

你可以看到它仍然在cacert.pm文件中寻找CA

1 个答案:

答案 0 :(得分:2)

我花了大约五个小时玩卷曲和RCurl。我能够让它运作起来。你想要的选择是cainfo,而不是capath。 Capath告诉RCurl在哪里查找证书文件。 Cainfo指定一个文件。

这适用于RCurl。

 library(RCurl)
> cer_file <- "/home/user/curltest/cacert.pem"
> server_url <- "some_server"
> getURL(server_url, cainfo=cer_file)

现在问题是如何让httr理解这个设置。该文档讨论了默认的ca_cert,但没有解释如何使用不同的证书。就我而言,我正在连接到不属于默认证书的Intranet站点。答案在于(config.R)[https://github.com/hadley/httr/blob/master/R/config.r]。 Httr允许我们设置RCurl配置选项,如下所示。

> cer_file <- "/home/me/curltest/cacert.pem"
> GET(login_url, config=list(cainfo=cer_file))

如果您要连接到互联网,您可能只需要更新HTTR附带的默认cacert。自述文件向您展示了如何执行此操作。这样您就不需要在每次调用中指定cert。

> setwd("path to httr package")
> GET("https://raw.githubusercontent.com/bagder/ca-bundle/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt",
  write_disk("inst/cacert.pem", overwrite = TRUE))