我使用Authlogic-Connect第三方登录。在运行适当的迁移后,Twitter/谷歌/yahoo登录似乎工作正常,但facebook登录抛出异常:

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

开发日志显示

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'

请建议. .


当前回答

问题是ruby找不到可以信任的根证书。在1.9 ruby检查这个。您需要确保系统中有pem文件形式的curl证书。您还需要确保证书位于ruby期望它位于的位置。你可以在……领取这张证书。

http://curl.haxx.se/ca/cacert.pem

如果您是RVM和OSX用户,那么您的证书文件位置将根据您使用的ruby版本而有所不同。使用:ca_path显式地设置路径是一个坏主意,因为当您的代码进入生产环境时,它将无法移植。你想在默认位置为ruby提供一个证书(并且假设你的开发人员知道他们在做什么)。您可以使用dtruss来确定系统在哪里查找证书文件。

在我的情况下,系统正在寻找证书文件

/Users/stewart.matheson/.rvm/usr/ssl/cert.pem

但是MACOSX系统需要一个证书

/System/Library/OpenSSL/cert.pem

我将下载的证书复制到这个路径,它工作了。HTH

其他回答

在Ubuntu上安装以下包为我解决了这个问题

Sudo apt-get安装libssl-dev

我有好几天都遇到了麻烦,到处乱闯。这个链接证明对我非常有帮助。它帮助我在MAC OS X 9上成功升级了SSL。

在最新macport的Mac OS X Lion上:

sudo port install curl-ca-bundle  
export SSL_CERT_FILE=/opt/local/share/curl/curl-ca-bundle.crt  

然后,重新运行失败的作业。

注意,自从Eric G在5月12日回答后,证书文件的位置似乎发生了变化。

如果你在/usr/local/etc/openssl中有一个指向cert.pem的符号链接,尝试这样做:

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)

下面是用于调试的另一个选项。

请确保永远不要在任何生产环境中使用它,因为它首先就会抵消使用SSL的好处。只有在您的本地开发环境中才可以这样做。

require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE