I am using Authlogic-Connect for third party logins. After running appropriate migrations, Twitter/Google/yahoo logins seem to work fine but the facebook login throws exception:
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
The dev log shows
OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed):
app/controllers/users_controller.rb:37:in `update'
Please suggest..
2
37 Answers
I ran into a similar problem when trying to use the JQuery generator for Rails 3
I solved it like this:
Get the CURL Certificate Authority (CA) bundle. You can do this with:
sudo port install curl-ca-bundle
[if you are using MacPorts]- or just pull it down directly
wget http://curl.haxx.se/ca/cacert.pem
Execute the ruby code that is trying to verify the SSL certification:
SSL_CERT_FILE=/opt/local/etc/certs/cacert.pem rails generate jquery:install
. In your case, you want to either set this as an environment variable somewhere the server picks it up or add something likeENV['SSL_CERT_FILE'] = /path/to/your/new/cacert.pem
in your environment.rb file.
You can also just install the CA files (I haven’t tried this) to the OS — there are lengthy instructions here — this should work in a similar fashion, but I have not tried this personally.
Basically, the issue you are hitting is that some web service is responding with a certificate signed against a CA that OpenSSL cannot verify.
9
This worked for me too while trying to connect to my gmail account using Ruby Net::IMAP from a ruby script.Thanks.
Yes, this works fine on ruby-1.9.3. I added it to my bash config.
export SSL_CERT_FILE=/usr/local/etc/openssl/certs/cert.pem
I didn’t have /usr/local/etc/openssl, so I ran
sudo curl http://curl.haxx.se/ca/cacert.pem >> /usr/local/etc/cacert.pem
followed byexport SSL_CERT_FILE=/usr/local/etc/cacert.pem
Developing on my Mac I just added
SSL_CERT_FILE=/usr/local/etc/openssl/cert.pem
to my app’s.env
file and voila – all happy.– Dave SagI appreciate the irony of using wget to download curl certificates.
– Trey
If you’re using RVM on OS X, you probably need to run this:
rvm osx-ssl-certs update all
More information here: http://rvm.io/support/fixing-broken-ssl-certificates
And here is the full explanation: https://github.com/wayneeseguin/rvm/blob/master/help/osx-ssl-certs.md
Update
On Ruby 2.2, you may have to reinstall Ruby from source to fix this. Here’s how (replace 2.2.3
with your Ruby version):
rvm reinstall 2.2.3 --disable-binary
Credit to https://stackoverflow.com/a/32363597/4353 and Ian Connor.
9
Here is a much more comprehensive writeup with alternatives: railsapps.github.io/openssl-certificate-verify-failed.html
– Peter P.ERROR: rvm update has been removed. See ‘rvm get’ and rvm ‘rubygems’ CLI API instead
– yang@user432506 How did you get that error? I’m using latest stable RVM and it still works.
– htanataThis would work for a while, then fail for me. What worked for me was running
rvm reinstall 2.2.0 --disable-binary
but then you have to bundle install and start fresh.This was a huge lifesaver and should be the accepted answer.
– Siraris
Here’s how you can fix it on Windows: https://gist.github.com/867550 (created by Fletcher Nichol)
Excerpt:
The Manual Way (Boring)
Download the
cacert.pem
file from http://curl.haxx.se/ca/cacert.pem. Save this file toC:RailsInstallercacert.pem
.Now make ruby aware of your certificate authority bundle by setting
SSL_CERT_FILE
. To set this in your current command prompt session, type:set SSL_CERT_FILE=C:RailsInstallercacert.pem
To make this a permanent setting, add this in your control panel.
3
Thank you. This is exceptionally useful and also very simple.
– JohnThe above solution didn’t help me. This is a better guide for Windows: stackoverflow.com/questions/5720484/…
@Sprachprofi The solution you’ve linked to will only work for 1 rails project at a time (as you’re pointing directly to that cert). The gist I’ve linked to (created by Fletcher Nichol) will allow it to cover every project/gem that’s looking for a certificate.
Ruby can’t find any root certificates to trust.
Take a look at this blog post for a solution: “Ruby 1.9 and the SSL error“.
The solution is to install the
curl-ca-bundle
port which contains the same root certificates used by Firefox:sudo port install curl-ca-bundle
and tell your
https
object to use it:https.ca_file="/opt/local/share/curl/curl-ca-bundle.crt"
Note that if you want your code to run on Ubuntu, you need to set the
ca_path
attribute instead, with the default certificates location/etc/ssl/certs
.
1
This seems to happen on Windows as well, in which case the solution recommended there won’t work.
– Bob Aman
The reason that you get this error on OSX is the rvm-installed ruby.
If you run into this issue on OSX you can find a really broad explanation of it in this blog post:
http://toadle.me/2015/04/16/fixing-failing-ssl-verification-with-rvm.html
The short version is that, for some versions of Ruby, RVM downloads pre-compiled binaries, which look for certificates in the wrong location. By forcing RVM to download the source and compile on your own machine, you ensure that the configuration for the certificate location is correct.
The command to do this is:
rvm install 2.2.0 --disable-binary
if you already have the version in question, you can re-install it with:
rvm reinstall 2.2.0 --disable-binary
(obviously, substitute your ruby version as needed).
3
This worked for me. The blog post you’re pointing to is also useful, thanks!
– CristianThis worked for me on El Capitan. I imploded rvm (rvm implode). Installed again with
curl -sSL https://get.rvm.io | bash -s stable --autolibs=homebrew
and thenrvm install <ruby-version> --disable-binary
At one point I also didrvm get head
as these are some bleeding edge issues.– rylanbOnly this solution worked for me, because originally I had Ruby 2.0.0 on El Capitan and for some reason that older version didn’t work even with correct
SSL_CERT_FILE
. Afterrvm install 2.2.0 --disable-binary
, the issue sorted.– laimison
The issue is that ruby can not find a root certificate to trust. As of 1.9 ruby checks this. You will need to make sure that you have the curl certificate on your system in the form of a pem file. You will also need to make sure that the certificate is in the location that ruby expects it to be. You can get this certificate at…
http://curl.haxx.se/ca/cacert.pem
If your a RVM and OSX user then your certificate file location will vary based on what version of ruby your using. Setting the path explicitly with :ca_path is a BAD idea as your code will not be portable when it gets to production. There for you want to provide ruby with a certificate in the default location(and assume your dev ops guys know what they are doing). You can use dtruss to work out where the system is looking for the certificate file.
In my case the system was looking for the cert file in
/Users/stewart.matheson/.rvm/usr/ssl/cert.pem
however MACOSX system would expect a certificate in
/System/Library/OpenSSL/cert.pem
I copied the downloaded cert to this path and it worked. HTH
5
For me on Ubuntu 12.04, the cert path which works is
~/.rvm/usr/ssl/cert.pem
How do you use dtruss to work out where the system is looking for the certificate?
– pingu@pingu can’t remember the exact command basically you run druss and you tell it to run what ever ruby process you want it to “inspect”. It’s output is very verbose but basically you will be able to see each system call ruby is making. One of the calls will be a read file call which will be pointing to a file that does not exist. Move the cert here or create a link and you should be good to go.
– StewartRuby should not be looking for a
cacert.pem
on OS X. OS X does not usecacert.pem
. System and user certificates are stored in the KeyChain. Ruby should be integrating with the KeyChain on OS X.– jwwWhat is the best way to do this? Can you post an example?
– Stewart
The new certified gem is designed to fix this:
3
Works with ruby 2.0.0p481 (2014-05-08) [i386-mingw32]
– EvmorovNot working for me with Rails 4.1.9, ruby-2.1.5. I added it to the Gemfile,
bundle
, explicitly addedrequire "certified"
just to be sure, and nothing changes. What am I missing?Ruby should not be looking for a
cacert.pem
on OS X. OS X does not usecacert.pem
. System and user certificates are stored in the KeyChain. Ruby should be integrating with the KeyChain on OS X. OpenSSL has never distributed acacert.pem
. Its not clear to me why any software would defer to OpenSSL for it.– jww
Just add gem ‘certified’ in your gemfile and run bundle install.
- gem ‘certified‘
- bundle install
2
It works perfectly with Rails and Debian 🙂 big big thanks!
On Mac OS X Lion with the latest macport:
sudo port install curl-ca-bundle
export SSL_CERT_FILE=/opt/local/share/curl/curl-ca-bundle.crt
Then, rerun the failed job.
Note, the cert file location seems to have changed since Eric G answered on May 12.
2
After all of the searching and a multitude of attempts, this was the only thing that solved the problem. Thanks!
cool, that fixed it. But as long as openssl is installed with homebrew, you have to add a
export SSL_CERT_FILE=/usr/local/etc/openssl/cacert.pem
to your .profile or .bashrc file– 23tux
A one liner fixes it for Windows in an Admin prompt
choco install wget
(first see chocolatey.org)
wget http://curl.haxx.se/ca/cacert.pem -O C:cacert.pem && setx /M SSL_CERT_FILE "C:cacert.pem"
Or just do this:
gem sources -r https://rubygems.org/
gem sources -a http://rubygems.org/
Milanio’s method:
gem sources -r https://rubygems.org
gem sources -a http://rubygems.org
gem update --system
gem sources -r http://rubygems.org
gem sources -a https://rubygems.org
gem install [NAME_OF_GEM]
2
Small improvement – you just need to update ruby and then you can add https source back – this just worked for me like a charm: gem sources -r rubygems.org => gem sources -a rubygems.org => gem update –system => gem sources -r rubygems.org => gem sources -a rubygems.org => gem install [NAME_OF_GEM]
– milanioError fetching rubygems.org: SSL_connect returned=1 errno=0 state=error: certificate verify failed (unable to get local issuer certificate) (api.rubygems.org/specs.4.8.gz)
– kAmol
Well this worked for me
rvm pkg install openssl
rvm reinstall 1.9.2 --with-openssl-dir=$rvm_path/usr
Something is wrong with openssl implementation of my ubuntu 12.04
2
Here’s another option for debugging purposes.
Be sure never to use this in any production environment, as it will negate benefits of using SSL in the first place. It is only ever valid to do this in your local development environment.
require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
9
Downvoted: Yes, this works, but the barrier to installing a valid CA bundle and actually solving the problem is so low that a solution like this – which near-completely invalidates the security of SSL – is not a solution that should be implemented unless you’re in an environment where the Certificate Authority is completely inaccessible (and even then, you should create a local CA that is accessible to both endpoints).
It didn’t near completely remove SSL protection, it completely removes it. Never do this.
– drbrainFor debugging it is sufficient
This produces a warning now in 1.9
– IvanThis is a bad solution for production work over the actual Internet, but it is emphatically not true that “you might as well not use SSL at all”. Traffic encrypted over the wire is better than traffic in the clear. Yes, you have the possibility of man-in-the-middle attacks, but those are at least one notch harder to stand up than simply eavesdropping on the plaintext traffic as it glides by.
While knowing it’s rather a lame solution, I’m still sharing this because it seems like very few people answering here use Windows, and I think some of Windows users (me included) would appreciate a simple and intuitive approach.
require 'openssl'
puts OpenSSL::X509::DEFAULT_CERT_FILE
That tells where your openssl is looking for the cert file. My name is not Luis, but mine was C:/Users/Luis/Code/luislavena/knap-build/var/knapsack/software/x86-windows/openssl/1.0.0l/ssl/cert.pem
. The path may be different depending on each own environments (e.g. openknapsack
instead of luislavena
).
The path didn’t change even after set SSL_CERT_FILE=C:foobarbazcert.pem
via the console, so… I created the directory C:UsersLuisCodeluislavenaknap-buildvarknapsacksoftwarex86-windowsopenssl1.0.0lssl
in my local disk and put a cert file into it.
Lame as it is, this will surely work.
2
Brilliant. Hacky, but this was the only thing that solved my problem.
Nice way of debugging… For me the user was “Justin”. Googling shows this seems to be a known issue with RubyInstaller. Unfortunately, creating that directory (+ pem file) myself, didn’t solve the issue for me
– Wouter
I’ve try install curl-ca-bundle
with brew
, but the package is no available more:
$ brew install curl-ca-bundle
Error: No available formula for curl-ca-bundle
Searching formulae...
Searching taps...
The solution that worked to me on Mac was:
$ cd /usr/local/etc/openssl/certs/
$ sudo curl -O http://curl.haxx.se/ca/cacert.pem
Add this line in your ~/.bash_profile
(or ~/.zshrc
for zsh):
export SSL_CERT_FILE=/usr/local/etc/openssl/certs/cacert.pem
Then update your terminal:
$ source ~/.bash_profile
4
This worked for me – but the path is wrong. Should be:
export SSL_CERT_FILE=/usr/local/etc/openssl/certs/cacert.pem
– dnlmzwThis is a nice solution, because of its simplicity. Also, by referencing the added certificate in
~/.bash_profile
, it leaves a reminder of what was added (and, crucially where) when further updates are required.– auxbussThis worked for me. @dnlmzw the path was fine for me but of course this depends on your setup. Thanks!
didn’t work for me when trying to add a private gem server URL that uses a self-signed certificate to my gem sources. OSX 10.11.6 + rbenv
I had this same issue while working on a Ruby project. I am using Windows 7 64bit.
I resolved this by:
- Downloading the cacert.pem file from http://curl.haxx.se/ca/cacert.pem.
- Saved that file to C:/RubyCertificates/cacert.pem
- Then set my environmental variable “SSL_CERT_FILE” to “C:RubyCertificatescacert.pem”
2
Since it is Windows, backslahes should be used in the value of the environment variable.
this is the only solution that worked to fix “bundle” for me, after fixing the rubygems ssl error
The most straightforward answer which worked for me was this
sudo apt-get install openssl ca-certificates
And voila!!!
2
Wish I could up vote more than once cause you just saved me so much time!
– Stephen@Stephen – I wish you could too :-). It saved me a lot of time, so I thought I’d post it here, and it might help someone else too.
OS X 10.8.x with Homebrew:
brew install curl-ca-bundle
brew list curl-ca-bundle
cp /usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt /usr/local/etc/openssl/cert.pem
4
Works for me on 10.9 as well.
Ok for me, OS X 10.9.1. Awesome!
Something is severely broken when you have to hunt down random solutions to fix these dumb problems. All of these answer do something entirely different and all of them seemed to help people at some point. WTF?
– sergsergcurl-ca-bundle was revmoved from brew
Then, as this blog post suggests,
“How to Cure Net::HTTP’s Risky Default HTTPS Behavior“
you might want to install the always_verify_ssl_certificates
gem that allow you to set a default value for ca_file
.
This worked for me. If you using rvm and brew:
rvm remove 1.9.3
brew install openssl
rvm install 1.9.3 --with-openssl-dir=`brew --prefix openssl`
I ran into this issue and the suggested fix of rvm osx-ssl-certs update all
did not work despite that I am an RVM user on OSX.
The fix that worked for me was re-installing the latest version of openssl:
brew update
brew remove openssl
brew install openssl
0
I fixed this problem by running this in terminal. Full writeup is available over here
rvm install 2.2.0 --disable-binary
OSX solution:
install latest rvm stable version
rvm get stable
use rvm command to solve the certificates automatically
rvm osx-ssl-certs update all
2
I tried this and it didn’t work for me. Here’s my solution: stackoverflow.com/a/16741712/62
Worked for me after installing Ruby 2.0.0 via RVM.
If you are running your rails app locally then just add this line at the bottom of application.rb.
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
After this you can use the app without any issues. You may call it a hack but it is not recommended. Use only when you need to run locally
Here’s what I did that helped if you are specifically having a problem on Leopard.
My cert was old and needed to be updated. I downloaded this:
http://curl.haxx.se/ca/cacert.pem
Then replaced my cert which was found here on Leopard:
/usr/share/curl/curl-ca-bundle.crt
Reload whatever you have that’s accessing it and you should be good to go!
Just because instructions were a slight bit different for what worked for me, I thought I add my 2 cents:
I’m on OS X Lion and using macports and rvm
I installed curl-ca-bundle:
sudo port install curl-ca-bundle
Then I adjusted my omniauth config to be this:
Rails.application.config.middleware.use OmniAuth::Builder do
provider :google_oauth2, APP_CONFIG['CONSUMER_KEY'], APP_CONFIG['CONSUMER_SECRET'],
:scope => 'https://www.google.com/m8/feeds https://www.googleapis.com/auth/userinfo.profile',
:ssl => {:ca_path => "/share/curl/curl-ca-bundle.crt"}
end
1
You could (and probably should) forgo the entire CA Zoo (
ca-bundle.crt
) and use Google Internet Authority G2 in:ssl => {:ca_path => "/share/curl/curl-ca-bundle.crt"}
. That’s the only one needed to certify connections to Google.– jww
If you have a symbolic link in the /usr/local/etc/openssl pointing to cert.pem try to do this:
ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE" (should be /usr/local/etc/openssl)
cd /usr/local/etc/openssl
wget http://curl.haxx.se/ca/cacert.pem
ln -s cacert.pem 77ee3751.0 (77ee3751.0 is my symbolic link, should depend on the openssl version)
What worked for me is a combination of answers, namely:
# Reinstall OpenSSL
brew update
brew remove openssl
brew install openssl
# Download CURL CA bundle
cd /usr/local/etc/openssl/certs
wget http://curl.haxx.se/ca/cacert.pem
/usr/local/opt/openssl/bin/c_rehash
# Reinstall Ruby from source
rvm reinstall 2.2.3 --disable-binary
I had trouble for a number of days and was hacking around. This link proved out to be extremely helpful for me. It helped me to do a successful upgrade of the SSL on MAC OS X 9.
Sometime it’s not always rvm’s problem
in MAC OSX,if you remove .rvm,the problem still(espcially while you backup data from timemachine) ,you can try this way.
1.brew update
2.brew install openssl
Adding gem 'certified', '~> 1.0'
to my Gemfile
and running bundle
solved this issue for me.
Does this help: stackoverflow.com/q/3977303/382818
Here is a the best solution I was able to find so far stackoverflow.com/a/16983443/11792