在CRAN pkg中使用ssl_verifypeer = FALSE?

时间:2017-05-29 04:02:05

标签: r ssl curl cran httr

我在CRAN上有一个API包,提供与联合国数据库(link到联合国网站)的接口,它是使用httr构建的,它使用curl包。我昨天发现我的软件包的核心功能在Windows机器上不再正常工作,它们都失败并显示错误消息:

Error in curl::curl_fetch_memory(url, handle = handle) : Peer certificate cannot be authenticated with given CA certificates

这基本上意味着CA证书问题阻止curl完成连接。仔细研究一下后,我认为托管数据库的联合国网站是个问题,它的SSL证书对于ssldecoder是无效的(请参阅此link)。

解决此问题的一个简单方法是向ssl_verifypeer = FALSE的所有调用添加参数httr::GET()。然而,出于安全原因,这不是一个理想的解决方案,因为无论网站证书的有效性如何,它都基本上告诉curl建立连接。

我的问题是,在CRAN包中使用此参数的共识是什么?请记住,联合国网站(大概)是安全的吗?

2 个答案:

答案 0 :(得分:3)

我不了解共识,但Hadley writes

  

除非您不想知道安全性何时受到威胁,否则不应将ssl.verifypeer = FALSE作为默认值。

那就是说,I have seen packages默认使用该选项。

问题是:如果没有有效证书,您如何知道联合国网站已遭到入侵?

我建议在程序包文档的顶部清楚地标记问题,并指出用户有责任设置该选项。并希望托管服务尽快修改其证书。

答案 1 :(得分:1)

通过https://curl.haxx.se/docs/sslcerts.html

  

获取可以验证远程服务器的CA证书,并在连接时使用正确的选项指出此CA证书以进行验证。对于libcurl黑客:curl_easy_setopt(curl, CURLOPT_CAPATH, capath);

在R curl选项中,即capath

如果您信任主cURL网站,则可以在https://curl.haxx.se/docs/caextract.html获取最新版本的版本。

cacert.pem === ca-bundle.crt如果您碰巧看到对这两者的引用。

如果更新的CA文件仍然会导致问题,那么只要将FALSE传递给您的函数,让他们认为他们没问题就会对用户造成伤害。

我不知道数据传输数据完整性丢失/操纵会给人们带来什么危害。但除此之外,标记的证书也是MITM用户的标志。无论哪种方式,你都应该三思而后行。