2017-02-09 81 views
0

发出HTTP请求时,我有一个服务,使一个HTTP请求,它看起来像这样:OpenSSL的错误在Ruby中

require 'net/http' 

class SenderNameService 
    def get_names(id) 
    domain = "http://www.somedomain.com" 
    path = "/api/orchards/users/#{id}" 
    url = URI.parse(domain + path) 

    req = Net::HTTP::Get.new(url.to_s) 
    token = generate_token 
    req.add_field("Authorization", token) 

    http = Net::HTTP.new(url.host, url.port) 
    http.use_ssl = true 
    res = http.start do |http| 
     http.request(req) 
    end 

    if res.code == '200' 
     return JSON.parse(res.body) 
    else 
     raise StandardError, "Request for sender names failed" 
    end 
    end 

    private 

    def generate_token 
    #Some JWT token generating logic goes here. 
    end 
end 

当我提出一个要求,我得到这个错误:

OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: unknown protocol 
from .rbenv/versions/2.3.3/lib/ruby/2.3.0/net/http.rb:933:in `connect_nonblock' 

这是怎么回事?那个错误是什么意思?

UPDATE:当我将http更改为https时,错误得到修复。到底是怎么回事?

+0

目标是否有可能拥有SHA1 SSL证书? – whodini9

回答

2
http.use_ssl = true 

UPDATE: The error gets fixed when I change http to https. What is going on?

默认为HTTP URL使用端口80,通常有只说HTTP服务器。 https服务器使用端口443,HTTPS服务器位于此端口。但是,您尝试在不支持TLS的服务器侦听的http端口上实施HTTPS(即TLS + HTTP)。这意味着您的客户端启动到此服务器的TLS握手,但不会收到TLS响应,而是返回HTTP响应。试图将响应解释为TLS导致您看到的错误,即未知的协议。

+0

等待但http不起作用,并且https可以正常工作。 – Jwan622

+1

@ Jwan622:您的代码正在HTTP端口上实施TLS,即您正在服务器仅使用HTTP的端口上尝试HTTPS,因此它不起作用。如果您将代码更改为使用HTTPS,则可以在服务器实际提供HTTPS的端口上使用HTTPS,因此它可以工作。 –

+0

哦,我明白了。 'use_ssl'代码在http端口上执行TLS。让我看看“TLS”是什么... – Jwan622

0

该版本的Ruby在http.rb中使用connect_nonblock来建立连接,该连接请求连接到给定套接字。套接字必须有一个地址和一个端口,因此它可能失败,因为它试图通过端口443连接到https地址(http.use_ssl = true),所以你应该使用https而不是http(需要实现服务器端SSL)或将http.use_ssl设置为false。请参考:http://apidock.com/ruby/Socket/connect_nonblock