我想在MacOSX上的Ruby應用程序中發出API請求。OpenSSL :: SSL :: SSLError與自制軟件OpenSSL握手失敗
當我嘗試這樣的事:
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'
我看了一些關於這方面的討論,特別是this one導致我相信這是我的OpenSSL沒有找到正確的cert.pem
文件的問題。我使用Homebrew,並且我的Homebrew OpenSSL安裝在/usr/local/bin
中。我想,OpenSSL的原始Mac版本是/usr/bin
。
我跟着建議,以一個全球性的ENV變量SSL_CERT_FILE
設定的路徑,我cert.pem
文件通過自制的安裝 - /usr/local/etc/openssl/cert.pem
, - 當我回顯變量,它被設置正確,但是當我重新打開一個Ruby控制檯並再試一次,我得到相同的錯誤。關於我在做什麼錯的想法?我對OpenSSL瞭解不多,而且我完全被這個漏掉了,因爲它似乎正在找到我的證書。
編輯
當我運行which openssl
,它顯示了Mac版 - /usr/bin/openssl
。這是有道理的,給家釀的安裝筆記:
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
文件?
謝謝!我不太瞭解SSL。如何檢查我是否使用SSL3.0或TLS1.0 +?我的Homebrew安裝的OpenSSL是最新的?任何建議的工具,使流量的數據包捕獲? – Sasha 2014-10-18 20:21:18
對於流量捕獲使用wireshark或tcpdump。您使用的是哪個SSL版本取決於您擁有的openssl版本以及您爲限制版本所做的任何設置。 – 2014-10-19 07:18:51