2017-02-09 79 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