ruby - API 请求 - OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server hello A

标签 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.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)安装到我的 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,这是否意味着他们最终需要该版本?

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

    最佳答案

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

    关于ruby - API 请求 - OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server hello A,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41731735/

    相关文章:

    internet-explorer - 在 Node.js 上使用 SSL 时,Internet Explorer 导致服务器硬崩溃

    python - jupyter notebook 停止 SSL 错误

    javascript - 如何在 JavaScript 和 Ruby 中对原始 URL 进行编码/解码以在两者中获得相同的值?

    c - 为什么我的代码中会出现 __stack_chk_fail?

    macos - Slime-repl 不在这里

    objective-c - Mac OSX - 如何使用 Cocoa 甚至纯 C 函数获取代理配置?

    iframe - 来自不同域的 SSL iframe 和 SSL 页面

    ruby - 用于查找 CPU 脚本使用情况的内置 Ruby 函数

    ruby : `read':File.read 中的无效参数 -(Errno::EINVAL)

    ruby - RSpec should_receive 没有到达类中的方法