Ruby SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server hello A (OpenSSL::SSL::SSLError) 错误,求大佬指教!

403 · 2017年11月19日 · 最后由 haibor 回复于 2017年11月30日 · 4747 次阅读

先贴上我的代码

# @uri =  URI.parse "https://api.******.com/"
def http_post(path,params)
  http = Net::HTTP.new(@uri.host, @uri.port)
  http.use_ssl = true
  http.send_request('POST', path, JSON.dump(params),@header)
end
当我发起一个请求的时候就会报错(之前调试其他 https 网站倒不会出现这样的问题!)

错误:

/Users/xxxx/.rvm/rubies/ruby-2.3.3/lib/ruby/2.3.0/net/http.rb:933:in `connect_nonblock': SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server hello A (OpenSSL::SSL::SSLError)
    from /Users/liuxin/.rvm/rubies/ruby-2.3.3/lib/ruby/2.3.0/net/http.rb:933:in `connect'
    from /Users/liuxin/.rvm/rubies/ruby-2.3.3/lib/ruby/2.3.0/net/http.rb:863:in `do_start'
    from /Users/liuxin/.rvm/rubies/ruby-2.3.3/lib/ruby/2.3.0/net/http.rb:852:in `start'
    from /Users/liuxin/.rvm/rubies/ruby-2.3.3/lib/ruby/2.3.0/net/http.rb:1398:in `request'
    from /Users/liuxin/.rvm/rubies/ruby-2.3.3/lib/ruby/2.3.0/net/http.rb:1378:in `send_request'
        ....

问题:

  • 1、这种错误该怎么解决? google 出来的解决方法 stackoverflow没有解决我的问题

  • 2、为什么对有些 HTTPS 的网站不会出现这样的错误?

还望各位大佬能为小弟解惑

可能是证书问题吧。。。。。

pynix 回复

证书问题该怎么解决。。。😰 😰

403 回复

欧也不知啊

pynix 回复

嗯嗯,谢谢提示。我来 Google 一波~~

少年 阿里 centos 6.x 吧?升级下你的 openssl

jicheng1014 回复

我在本地测的

  • 系统 macOS High Sierra 10.13.1 (17B48)
  • openssl (2.0.6)
7 楼 已删除

哪些正常,哪些网站不正常呢?请提供一些可供其他人复现,调试的测试 case

403 关闭了讨论。 11月21日 14:44
403 重新开启了讨论。 11月21日 14:45

如果实在不行 但是又非常有必要访问 这招 通吃 但是 ssl 的意义就没了

require 'openssl'

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

try this


require 'excon'
require 'tach' 
Excon.defaults[:ssl_ca_path] = "d:\\"
Excon.defaults[:ssl_ca_file] = 'D:\\run.cer'
#Excon.defaults[:ssl_verify_peer] = false

    response = Excon.get('https://ruby-china.org')
    response.body       # => "..."
    p response.headers    # => {...}
    p response.remote_ip  # => "..."
    p response.status     # => 200

jicheng1014 回复

这招我试过,也访问不了~~~

haibor 回复

谢谢了

something else

require 'net/https' 
require 'uri' 
uri = URI.parse('https://liuwm-pc:8081/2.html') 
http = Net::HTTP.new(uri.host, uri.port) 
http.use_ssl = true 
if uri.scheme == "https"  # enable SSL/TLS 
http.cert =OpenSSL::X509::Certificate.ne(File.read("D:/111/client.crt")) 
http.key =OpenSSL::PKey::RSA.new((File.read("D:/111/client.key")), "123456")# key and password 
http.verify_mode = OpenSSL::SSL::VERIFY_NONE #这个也很重要 
http.start { 
  http.request_get(uri.path) {|res| 
    print res.body 
  } 
}
需要 登录 后方可回复, 如果你还没有账号请 注册新账号