quantmod - SSL: unable to get local issuer certifi

2019-04-03 06:13发布

问题:

I’m trying to use quantmod package in R to get financial data from Yahoo. It works perfectly on my personal laptops (Mac and Win). But I cannot make it work on my working computer (Win7).

My code is:

getSymbols("JPM", src = "yahoo")

Please note it only doesn't work on my company laptop.

Here's the error code:

Error in curl::curl_download(cu, tmp, handle = h) : 
SSL certificate problem: unable to get local issuer certificate

I have tried to solve the problems in the following ways:

  1. install httr package
  2. Delete curl, quantmod and reinstall
  3. Update to the latest version of R, RStudio, curl, httr, RCurl and quantmod
  4. Install openssl package
  5. Set ssl_verifypeer = 0L
  6. add the following before getSymbols

    options(download.file.method = "wget", download.file.extra = c("--no-check-certificate"))

Unfortunately, none of the above works. BTW, fetch data from google finance works but Google only provide ~ 4000 records per request.

I think our company has some restrictions on SSL but I'm totally fine in accessing websites start with https://

Also, the following code works:

library('httr')    
content(GET('https://www.linkedin.com/in/lillyzhu'))

and

devtools::install_github

I have spent a week to solve this problem but I didn't make any progress. Now, I'm wondering is that possible to fix it? Any ideas will be helpful!

Thanks to all the contributors, have a great one! Appendix: output from libcurlVersion()

[1] "7.40.0"
attr(,"ssl_version")
[1] "OpenSSL/1.0.0o"
attr(,"libssh_version")
[1] "libssh2/1.4.3"
attr(,"protocols")
 [1] "dict"   "file"   "ftp"   
 [4] "ftps"   "gopher" "http"  
 [7] "https"  "imap"   "imaps" 
[10] "ldap"   "pop3"   "pop3s" 
[13] "rtmp"   "rtsp"   "scp"   
[16] "sftp"   "smtp"   "smtps" 
[19] "telnet" "tftp"  

Please feel free to let me know if you need any additional information of my laptop.

UPDATE: I test the function on my company's laptop without logging in VPN, it works. So any idea to make it work inside VPN?

回答1:

The problem is because cURL is using OpenSSL by default. It can be fixed to use winSSL by installing a special version of cURL by,

Sys.setenv(LIBCURL_BUILD="winssl")
install.packages("https://github.com/jeroen/curl/archive/master.tar.gz", repos = NULL)

Please refer to this link:

https://github.com/jeroen/curl/issues/122



回答2:

The error is often caused by an outdated or missing bundle of CA root certificates, but can also occur when the remote server is using a self-signed certificate. In either case cURL cannot verify the remote server's certificate and throws an error.

You can disable the requirement to verify certificates by using:

library(httr)
httr::set_config(config(ssl_verifypeer = FALSE))

However this is not recommended as it creates security vulnerabilities.