ruby - Mountain Lion 上的 SSL 问题 - Ruby/RVM/OpenSSL

标签 ruby ruby-on-rails-3 openssl evernote

我已经尝试了一切方法来解决这个问题,但没有任何效果。我已经卸载了所有内容并重新安装。还是没有爱。这是我在尝试连接 Evernote API 时遇到的错误。

OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A

我正在运行: RVM 1.15.9
ruby 1.9.3-p194
OpenSSL 1.0.1c
Rails 3.2.8
自制0.9.3

我已经尝试了几乎所有的方法。遵循本指南 http://railsapps.github.com/openssl-certificate-verify-failed.html

尝试使用 Evernote API,这就是这一切的开始。 cURL 可以很好地 ping HTTPS 地址。 干杯。

最佳答案

可能是 SSL v2 和 v3 之间的问题。

命令行诊断:

要诊断此问题,请在命令行上尝试以下操作:

$ openssl s_client -connect sandbox.evernote.com:443

该命令可能会失败,如下所示:

CONNECTED(00000003)
140386475906720:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure
...

现在尝试仅使用 SSL3:

openssl s_client -no_tls1 -no_ssl2 -ssl3 -connect  sandbox.evernote.com:443

你想要得到这样的结果:

CONNECTED(00000003)
depth=2 C = US, O = "VeriSign, Inc.", OU = VeriSign Trust Network
...

如果第一个命令失败,而第二个命令成功,则问题很可能是 SSL2 与 SSL3。

Ruby 诊断:

#!/usr/bin/env ruby                                                                                                                                                                                                                                                              
require 'net/http'
uri = URI.parse('https://sandbox.evernote.com/')
req = Net::HTTP::Get.new(uri.path)
sock = Net::HTTP.new(uri.host, 443)
sock.use_ssl = true

# Try with default SSL                                                                                                                                                                                                                                                           
begin
  sock.start do |http|
    response = http.request(req)
  end
  puts "success with SSL default"
rescue
  puts "failure with SSL default"
end

# Try with just SSL3                                                                                                                                                                                                                                                             
sock.ssl_version="SSLv3"
begin
  sock.start do |http|
    response = http.request(req)
  end
  puts "success with SSLv3"
rescue
  puts "failure with SSLv3"
end

如何修复它:

警告:这是一个黑客行为。使用风险自负。如果有人找到更好的方法来做到这一点,请在这里发表评论。

修补 HTTP.new 以强制其始终使用 SSLv3

require 'net/http'
module Net
  class HTTP < Protocol
    def HTTP.new(address, port = nil, p_addr = nil, p_port = nil, p_user = nil, p_pass = nil)
      socket = Proxy(p_addr, p_port, p_user, p_pass).newobj(address, port)
      socket.ssl_version = "SSLv3"
      socket
    end
  end
end

uri = URI.parse('https://sandbox.evernote.com/')
req = Net::HTTP::Get.new(uri.path)
sock = Net::HTTP.new(uri.host, 443)
sock.use_ssl = true

# Try with default SSL                                                                                                                                                                                                                                                           
begin
  sock.start do |http|
    response = http.request(req)
  end
  puts "success with SSL default"
rescue
  puts "failure with SSL default"
end

关于ruby - Mountain Lion 上的 SSL 问题 - Ruby/RVM/OpenSSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12514124/

相关文章:

ruby-on-rails - 如何在 Rails 3 中路由多级嵌套资源?

已安装 SSL 但未锁定

c++ - HTTPS 客户端和服务器一起使用 C++ 和 POCO 库(SSL 上下文问题)?

java - 无法使用 RSA 公钥(使用 bouncycaSTLe 创建的 PEM 文件)来加密文件

ruby-on-rails - Rails 强制模型急切加载

ruby - 如何在 Ruby 中编写复杂的多行 if 条件?

ruby-on-rails - 在更新中从 Stripe 订阅中删除优惠券

ruby-on-rails - Ruby 在数组中排序哈希时遇到问题

ruby-on-rails - Sinatra 应用程序作为 Rails 3 子路径

sql - rails order through count 在其他表上