在尝试使用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.1943.211…*已连接
- 连接至www.google.com(173.1943.211)端口443(#0)
- 成功设置证书验证位置:
- CA文件:C:\Users/malek.safa/Documents/R/win-library/3.0/httr/cacert.pemCA路径:无
- SSL证书问题,请验证CA证书是否正常。详细信息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败
- 正在关闭连接#0函数错误(类型,消息,asError=TRUE):SSL证书问题,请验证CA证书是否正常。详细信息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败
您可以看到它仍在cacert.pm文件
我花了大约五个小时玩curl和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站点。答案在配置中。R.Httr允许我们设置RCurl配置选项,如下所述。
cer_file <- "/home/me/curltest/cacert.pem"
GET(login_url, config=list(cainfo=cer_file))
如果你正在连接到互联网,你可能只需要更新HTTR附带的默认cacert。Readme向您展示了如何做到这一点。这样,您就不需要在每次调用中都指定证书。
setwd("path to httr package")
GET("https://raw.githubusercontent.com/bagder/ca-bundle/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt",
write_disk("inst/cacert.pem", overwrite = TRUE))