使用 httr 解决“SSL 证书问题:无法获取本地颁发者证书”

resolve " SSL certificate problem: unable to get local issuer certificate" with httr

我知道那里有很多类似的问题,例如

但我无法找到答案并将它们应用到我的具体案例中。这是我的 MCVE:

library(httr)
url <- "http://www.ece.mcmaster.ca/~shirani/"
res <- try(http_status(GET(url,timeout(30))))

Error in curl::curl_fetch_memory(url, handle = handle) : SSL certificate problem: unable to get local issuer certificate

我很确定这意味着远程网络服务器正在使用我的系统无法识别的证书。我相信有两种解决方案,(1) 告诉 httr/RCurl/curl 忽略该问题并在不安全模式下运行(命令行标志 -k/--insecure)或(2) 获取适当的证书并将其存储在某处。

设置'insecure'options/ignoring问题

this question 的回答建议(对于 PHP)

use curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1) and curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false)

?httr:config() 建议

Generally you should only need to use this function to set CURL options directly if there isn't already a helpful wrapper function, like set_cookies, add_headers or authenticate. To use this function effectively requires some knowledge of CURL, and CURL options. Use httr_options to see a complete list of available options. To see the libcurl documentation for a given option, use curl_docs.

我该如何将这个建议付诸实践?

httr_options() 提供

206             ssl_verifyhost             CURLOPT_SSL_VERIFYHOST  integer
207             ssl_verifypeer             CURLOPT_SSL_VERIFYPEER  integer

但是

res <- try(http_status(GET(url,timeout(max_time),
           config=list(ssl_verifyhost=0, ssl_verifypeer=0))))

给出了相同的错误(包括 ssl_verifystatus=0,我看到的唯一其他 ssl_* 选项也是如此)。

获得正确的证书,或者麻烦网站维护者

如果我宁愿把事情做对,也不要忽视问题。我将如何 (1) 确定我需要的证书,(2) 在 httr 内将其安装在我的 system/using 上(我在 Linux PopOS 18.04),(3)如果他们应该更新他们的证书,请与网站维护者进行连贯的沟通?

我用错了config。这似乎有效:

res <- http_status(GET(url,config(ssl_verifypeer=0)))

我仍然对更有原则的解决方案感兴趣(即弄清楚如何安装和部署正确的证书)。