【问题标题】:API Request - OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server hello AAPI 请求 - OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server hello A
【发布时间】:2017-06-03 13:24:16
【问题描述】:

这些问题中的另一个,我知道 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 钥匙串中
  • 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,这是否意味着他们最终需要该版本?

抱歉所有问题。提前致谢

【问题讨论】:

  • 我将开始回答一些我在走的过程中发现的问题。 “另外,我注意到无论我输入什么 proxy_requst.ssl_version,我的错误总是指定 SSLv2/v3,这是否意味着他们最终需要那个版本?”如果你查看puts OpenSSL::SSL::SSLContext::DEFAULT_PARAMS,默认的 SSL 版本是 :ssl_version=>"SSLv23",所以他们不需要它,它在默认值中指定
  • 另外,我想出了更多信息,我想我不需要担心 4a。和 4b,因为即使我的操作系统和 Ruby OpenSSL 版本不匹配,据我所知,Ruby 可以正常工作。 4C。我发现我可以手动添加他们的 ca_file,但我已将其更改为使用 cert_store = OpenSSL::X509::Store.new 然后 cert_store.add_cert。

标签: ruby macos ssl heroku homebrew


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多