我在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包中使用此参数的共识是什么?请记住,联合国网站(大概)是安全的吗?
答案 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用户的标志。无论哪种方式,你都应该三思而后行。