gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:51:13 26 4
gpt4 key购买 nike

我已尽一切努力解决此问题,但无法正常工作。我已经卸载了所有内容并重新安装。还是没有爱。这是我在尝试连接 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
导轨 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

如何修复:

警告:这是一个 hack。使用风险自负。如果有人找到更好的方法,请在此处发表评论。

修补 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com