我正在尝试在MacOSX上的Ruby应用程序中发出API请求。
当我尝试这样的事情时:
RestClient.get("https://api.foursquare.com/v2/venues/explore?near=NYC&query=McDonalds")
我得到了这个(当它是http
时相同):
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server hello A: sslv3 alert handshake failure
from /Users/sasha/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/net/http.rb:920:in `connect'
(如果我尝试(open("https://...")
),我明白了:
OpenURI::HTTPError: 400 Bad Request
from /Users/sasha/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/open-uri.rb:353:in `open_http'
我看了一些有关此问题的SO讨论,特别是this one让我相信这是我的OpenSSL找不到合适的cert.pem
文件的问题。我正在使用Homebrew,而我的Homebrew OpenSSL安装在/usr/local/bin
中。我认为OpenSSL的原始Mac版本是/usr/bin
。
我按照建议将全局ENV变量SSL_CERT_FILE
设置为Homebrew安装的cert.pem
文件的路径 - /usr/local/etc/openssl/cert.pem
, - 当我回显该变量时,它是设置正确,但当我重新打开一个Ruby控制台并再试一次时,我得到了同样的错误。关于我做错了什么的想法?我对OpenSSL了解不多,而且我完全对这个问题感到茫然,因为它似乎正在找到我的证书。
修改
当我运行which openssl
时,会显示Mac版本 - /usr/bin/openssl
。根据Homebrew的安装说明,这是有道理的:
A CA file has been bootstrapped using certificates from the system
keychain. To add additional certificates, place .pem files in
/usr/local/etc/openssl/certs
and run
/usr/local/opt/openssl/bin/c_rehash
This formula is keg-only, which means it was not symlinked into /usr/local.
Mac OS X already provides this software and installing another version in
parallel can cause all kinds of trouble.
The OpenSSL provided by OS X is too old for some software.
Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you'll need to add to your
build variables:
LDFLAGS: -L/usr/local/opt/openssl/lib
CPPFLAGS: -I/usr/local/opt/openssl/include
这是问题吗?在我的OpenSSL版本中,我包含了错误的cert.pem
文件?
答案 0 :(得分:1)
state = SSLv3 read server hello A:sslv3 alert handshake failure
这通常不是证书错误或丢失的问题,而是服务器不喜欢客户端发送的内容,例如不支持的SSL版本或客户端提供的不适当的密码。 如果我尝试连接SSL3.0而不是TLS1.0或更高版本,我会在此主机上出现此错误,因此请确保您不再使用SSL3.0。
如果这不能帮助抓取流量的数据包并将其发布到cloudshark.org,那么可以查看流量详情。