Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby API请求-OpenSSL::SSL::SSLError:SSL\U connect SYSCALL返回=5 errno=0 state=SSLv3读取服务器hello A_Ruby_Macos_Ssl_Heroku_Homebrew - Fatal编程技术网

Ruby API请求-OpenSSL::SSL::SSLError:SSL\U connect SYSCALL返回=5 errno=0 state=SSLv3读取服务器hello A

Ruby API请求-OpenSSL::SSL::SSLError:SSL\U connect SYSCALL返回=5 errno=0 state=SSLv3读取服务器hello A,ruby,macos,ssl,heroku,homebrew,Ruby,Macos,Ssl,Heroku,Homebrew,其中的另一个问题,我知道这个问题在StackOverflow上被问了很多(并得到了回答),但我无法让这些问题中的任何一个对我有用,我还有一些问题想学习 这是我的错误: OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server hello A 首先,这里是我的系统设置 我在OSX El Capitan版本10.11.6上 openssl version OpenSSL 0.9.8

其中的另一个问题,我知道这个问题在StackOverflow上被问了很多(并得到了回答),但我无法让这些问题中的任何一个对我有用,我还有一些问题想学习

这是我的错误:

OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server hello A
首先,这里是我的系统设置

我在OSX El Capitan版本10.11.6上

openssl version
 OpenSSL 0.9.8zh 14 Jan 2016

which openssl  
  /usr/bin/openssl

ruby -v 
  ruby 2.1.6p336 (2015-04-13 revision 50298) [x86_64-darwin14.0]

rbenv -v
  rbenv 0.4.0
我的问题是:

1) 这个错误是否意味着一个证书被发送回我,然后我的OpenSSL版本无法验证它?其他服务器是否有机会阅读我的,甚至看到它?除了打开像Wireshark这样的程序之外,还有没有其他方法可以使用Net::HTTP深入研究这个请求并检查它?一旦我调用net::HTTP.new.request(request),我似乎失去了控制,它只是错误

2) 我是否成功地与另一台服务器通话,但它拒绝了我

3) 当我收到此消息时,我在请求中处于什么位置

最重要的是

4) 我有什么办法来克服这一点

  • 4a。到目前为止,我看到了一个可能的brew解决方案,但我还没有将brew连接到链接
  • 4b。我可以手动将Mozilla的CA(或任何其他CA)安装到MacOSX密钥链中
  • 4c。我可以像我在代码中尝试的那样使用request.ca_file=“file”附加文件吗?(见下文)
  • 4d。是否有其他解决方案/最佳且政治上最正确的版本
5) 当我部署到Heroku时是否会出现此问题

据我所知,这是我的操作系统没有包含正确的CA文件的问题。
ca_文件
部分是由于我第一次尝试将正确的ca_文件添加到请求中。我猜我不需要这个。我在heroku中使用代理,因为此API需要静态IP

这是我的通用代码

cert    = File.read(File.join(Rails.root, 'ssl', 'test_env', 'their_test_cert.der'))
ca_file = File.read(File.join(Rails.root, 'ssl', 'test_env', 'Class3PublicPrimaryCA.der'))

uri     = URI("https://xml.theirtestenv.com/api/receive")

headers              = {
  'x-IK-Version'       => 'IKR/V4.00',
}

proxy_host = "myproxyhose"
proxy_port = "1234"
proxy_user = "myproxyuser"
proxy_pass = "myproxypass"

proxy_request = Net::HTTP.new(uri.hostname, '443', proxy_host, proxy_port, proxy_user, proxy_pass)

# http.key = OpenSSL::PKey::RSA.new(rsa_key)

proxy_request.use_ssl = true
proxy_request.cert = OpenSSL::X509::Certificate.new(cert)
proxy_request.ca_file = ca_file
proxy_request.verify_mode     = OpenSSL::SSL::VERIFY_PEER
# proxy_request.ssl_version     = :SSLv3
# This doesn't seem to matter whether I put this or not...

# Tried variations of these...
# proxy_request.ssl_version = :TLSv1
# proxy_request.ciphers = ['DES-CBC3-SHA']

post_request = Net::HTTP::Post.new(uri, headers)
post_request.content_type = "multipart/related"

response = proxy_request.request(post_request)
puts response.inspect
另外,我注意到,无论我输入什么
proxy\u requust.ssl\u版本
,我的错误总是指定SSLv2/v3,这是否意味着他们需要该版本


很抱歉问了这么多问题。提前感谢

已经有一段时间了,但我只想说这是几个问题,我通过的证书不是正确的,它们适用于错误的环境。一旦通过了正确的证书,这就开始起作用了,尽管我从来没有完全弄清楚SSL版本的问题。

这已经有一段时间了,但我只想说这是几个问题,我所传递的证书不是正确的,它们是用于错误的环境的。一旦通过了正确的证书,这项工作就开始了,尽管我从未完全弄清楚SSL版本的问题。

我将开始回答一些我已经弄明白的问题。“另外,我注意到,无论我放置的是什么proxy_requst.ssl_版本,我的错误总是指定SSLv2/v3,这是否意味着他们需要该版本?”如果您查看
put OpenSSL::ssl::SSLContext::DEFAULT_PARAMS
,默认的ssl版本是:ssl_version=>“SSLv23”,因此他们不需要它,它是在defaultsAlso中指定的,我有更多的信息,我想我不需要担心4a。还有4b,因为即使我的操作系统和Ruby OpenSSL版本不匹配,据我所知,Ruby one在这方面也可以正常工作。4C。我发现我可以手动添加他们的ca_文件,但我已将其更改为使用cert_store=OpenSSL::X509::store.new,然后使用cert_store.add_cert。我将开始回答一些我已经解决的问题。“另外,我注意到,无论我放置的是什么proxy_requst.ssl_版本,我的错误总是指定SSLv2/v3,这是否意味着他们需要该版本?”如果您查看
put OpenSSL::ssl::SSLContext::DEFAULT_PARAMS
,默认的ssl版本是:ssl_version=>“SSLv23”,因此他们不需要它,它是在defaultsAlso中指定的,我有更多的信息,我想我不需要担心4a。还有4b,因为即使我的操作系统和Ruby OpenSSL版本不匹配,据我所知,Ruby one在这方面也可以正常工作。4C。我发现我可以手动添加他们的ca_文件,但我已将其更改为使用cert_store=OpenSSL::X509::store.new,然后使用cert_store.add_cert。