API请求 – OpenSSL :: SSL :: SSLError:SSL_connect SYSCALL返回= 5 errno = 0 state = SSLv3读取服务器hello A

这些问题中的另一个,我知道这个问题已经在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版本无法validation它? 其他服务器是否有机会阅读我的,甚至看到它? 有没有办法使用Net :: HTTP深入研究这个请求,除了打开像Wireshark这样的程序之外还要检查一下? 一旦我调用net :: HTTP.new.request(请求),我似乎失去了控制,它只是错误。

2)我是否成功地与其他服务器通话,它否认了我?

3)当我收到此消息时,我在请求中的哪一点?

最重要的是

4)我有什么选择来克服这一点

  • 4A。 到目前为止,我看到了一个可能的啤酒解决方案,但我还没有能够酿造啤酒
  • 4B。 我可以手动将Mozilla的CA(或任何其他CA)安装到我的Mac OSX Keychain中
  • 4C。 我可以在我的代码中尝试使用request.ca_file =“file”附加文件吗? (见下文)
  • 4D。 有没有其他解决方案/最好和最政治正确的版本?

5)部署到Heroku时,我是否会遇到此问题?

从我正在阅读,这是我的操作系统不包含正确的CA文件的问题。 ca_file部分是由于我第一次尝试将正确的ca_file添加到我的请求中。 我猜我不需要那个。 我正在使用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_requst.ssl_version ,我的错误总是指定SSLv2 / v3,这是否意味着他们需要该版本?

抱歉有这些问题。 提前致谢