我正在使用 rvest
来抓取网站。我对其他网站完全没问题,但我认为这个网站使用的是另一种类型的证书。我在这里和 github 中看到过类似的问题,但没有人可以帮助我。
任何帮助表示赞赏。
我的脚本如下:
url <- "https://search.codal.ir/api/search/v1/q?PageNumber=1&Symbol=%D9%81%D8%B3%D8%A7&Subject=%20&CompanyState=0&LetterType=6&TracingNo=-1&LetterCode=%20&FromDate=1395/01/01&ToDate=%DB%B1%DB%B3%DB%B9%DB%B8/%DB%B0%DB%B3/%DB%B1%DB%B6&AuditorRef=-1&YearEndToDate=&Publisher=false&Mains=true&Childs=false&Audited=false&NotAudited=true&Length=-1&Consolidatable=true&NotConsolidatable=true&CompanyType=1&Category=1"
data <- fromJSON(url)[[3]]
错误是:
"Error in open.connection(con, "rb") : SSL certificate problem: unable to get local issuer certificate"
最佳答案
这是一个配置错误的服务器 (search.codal.ir)。可能可以考虑向他们的管理员发送一封友好的电子邮件。
这里的问题是这个 TLS 服务器在握手中没有发送完整的证书链,而根据标准它应该发送完整的证书链。更具体地说,它不发送中间证书。通过将“search.codal.ir”发布到 SSL 实验室测试页面和 the results are clear 可以看到这一点。 .
中间证书是介于根证书(存在于 CA 存储中)和服务器自己的证书之间的证书。
这有时在浏览器中比使用curl效果更好,因为
- 浏览器通常缓存中间证书(可供多个主机使用)
- 某些浏览器(例如 Chrome)支持 AIA(权威信息访问)等功能,使其能够按需下载中间证书。 RFC 5280 has the details .
curl 错误消息无法获取本地颁发者证书
几乎总是意味着发生了这种情况。
修复它
真正正确的修复应该由服务器管理员完成。这是服务器设置问题。
解决这个问题
您可以手动下载中间证书并将其放入您的 CA 存储中,即您告诉curl(或其他客户端)在验证对等方时使用的 PEM 文件。
SSL 实验室页面对缺少的中间证书进行了以下说明:
Certum Organization Validation CA SHA2
Fingerprint SHA256: fd02362244f31266caff005818d1004ec4eb08fb239aafaaafff47497d6005d6
Pin SHA256: 51GveKNrpJjtGpXY5QDx03s3YTQwaQic6dWBqo3zX6s=
RSA 2048 bits (e 65537) / SHA256withRSA
(我找不到从哪里下载)
不要这样做
您可以完全禁用证书验证,这样您的程序就可以继续运行。但你已经放弃了所有的安全感,一路上只有悲伤和泪水。仅用于实验,切勿用于生产。
关于r - 如何解决ubuntu 16.04中的 "ssl certificate problem: unable to get local issuer certificate",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56547867/