Как подключиться к https-серверу с недопустимым сертификатом, используя последние версии Ruby
Рассмотрим следующий код:
require 'net/https'
uri = URI.parse("https://host/index.html")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Get.new(uri.path)
response = http.request(request)
где https://host/index.html
- действительный адрес с недопустимым сертификатом на сервере.
В старых версиях ruby (в частности, 1.8.7-p334 и 1.9.2-p180) этот код работает нормально. Во всех последних версиях (1.8.7-p352, 1.9.2-p290 и 1.9.3-p0) это исключает следующее:
OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=unknown state
в последней строке.
Изменение параметра verify_mode на OpenSSL::SSL::VERIFY_PEER
дает точно ошибку, предполагающую, что он пытается проверить сертификат, несмотря на настройку.
Как я могу убедить Ruby игнорировать недействительный сертификат и подключиться?
Ответы
Ответ 1
uri = URI("https://host/index.html")
req = Net::HTTP::Get.new(uri.path)
res = Net::HTTP.start(
uri.host, uri.port,
:use_ssl => uri.scheme == 'https',
:verify_mode => OpenSSL::SSL::VERIFY_NONE) do |https|
https.request(req)
end
Ответ 2
require 'nokogiri'
require 'open-uri'
require 'net/https'
@doc = Nokogiri::HTML(open(my_url, :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE))