2013-09-04 3 views
1

Как и многие другие, у меня есть ошибка с Ruby: SSL_connect возвращается = 1 errno = 0 state = SSLv3 читать сертификат сервера B: проверка сертификата не выполнена.Получить сертификат PEM: SSL_connect возвращен = 1 errno = 0 state = SSLv3 считать сертификат сервера B: не удалось проверить сертификат

Я скачал cacert.pem и попытался добавить это следующим образом:

require 'net/http' 

# create a path to the file "C:\RailsInstaller\cacert.pem" 
cacert_file = File.join(%w{c: RailsInstaller cacert.pem}) 

Net::HTTP.start("curl.haxx.se") do |http| 
    resp = http.get("/ca/cacert.pem") 
    if resp.code == "200" 
    open(cacert_file, "wb") { |file| file.write(resp.body) } 
    puts "\n\nA bundle of certificate authorities has been installed to" 
    puts "C:\\RailsInstaller\\cacert.pem\n" 
    puts "* Please set SSL_CERT_FILE in your current command prompt session with:" 
    puts "  set SSL_CERT_FILE=C:\\RailsInstaller\\cacert.pem" 
    puts "* To make this a permanent setting, add it to Environment Variables" 
    puts " under Control Panel -> Advanced -> Environment Variables" 
    else 
    abort "\n\n>>>> A cacert.pem bundle could not be downloaded." 
    end 
end 

И как это:

require 'open-uri' 
require 'net/https' 

module Net 
    class HTTP 
    alias_method :original_use_ssl=, :use_ssl= 

    def use_ssl=(flag) 
     self.ca_file = Rails.root.join('lib/ca-bundle.crt') 
     self.verify_mode = OpenSSL::SSL::VERIFY_PEER 
     self.original_use_ssl = flag 
    end 
    end 
end 

Я даже пытался отменить проверку:

require 'faraday' 
module Faraday 
class Adapter 
class NetHttp < Faraday::Adapter 
    def call(env) 
    super 

    is_ssl = env[:url].scheme == 'https' 

    http = net_http_class(env).new(env[:url].host, env[:url].port || (is_ssl ? 443 : 80)) 
    if http.use_ssl = is_ssl 
     ssl = env[:ssl] 
     if ssl[:verify] == false 
     http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
     else 
     http.verify_mode = OpenSSL::SSL::VERIFY_NONE # <= PATCH or HACK ssl[:verify] 
     end 
     http.cert = ssl[:client_cert] if ssl[:client_cert] 
     http.key  = ssl[:client_key] if ssl[:client_key] 
     http.ca_file = ssl[:ca_file]  if ssl[:ca_file] 
    end 
    req = env[:request] 
    http.read_timeout = net.open_timeout = req[:timeout] if req[:timeout] 
    http.open_timeout = req[:open_timeout]    if req[:open_timeout] 

    full_path = full_path_for(env[:url].path, env[:url].query, env[:url].fragment) 
    http_req = Net::HTTPGenericRequest.new(
     env[:method].to_s.upcase, # request method 
     (env[:body] ? true : false), # is there data 
     true,      # does net/http love you, true or false? 
     full_path,     # request uri path 
    env[:request_headers])  # request headers 

    if env[:body].respond_to?(:read) 
     http_req.body_stream = env[:body] 
     env[:body] = nil 
    end 

    http_resp = http.request http_req, env[:body] 

    resp_headers = {} 
    http_resp.each_header do |key, value| 
     resp_headers[key] = value 
    end 

    env.update \ 
     :status   => http_resp.code.to_i, 
     :response_headers => resp_headers, 
     :body    => http_resp.body 

    @app.call env 
    rescue Errno::ECONNREFUSED 
    raise Error::ConnectionFailed.new(Errno::ECONNREFUSED) 
    end 

    def net_http_class(env) 
    if proxy = env[:request][:proxy] 
     Net::HTTP::Proxy(proxy[:uri].host, proxy[:uri].port, proxy[:user], proxy[:password]) 
    else 
     Net::HTTP 
    end 
    end 
end 
end 
end 

Но не повезло (и не так, как вы хотите это исправить). Странно, что он работает иногда.

Сейчас я пытаюсь это, но есть проблемы с поиском сертификатов:

require 'net/http' 

url = URI.parse('https://www.xpiron.com/schedule') 
req = Net::HTTP::Get.new(url.path) 
sock = Net::HTTP.new(url.host, 443) 
sock.use_ssl = true 
store = OpenSSL::X509::Store.new 
store.add_cert OpenSSL::X509::Certificate.new(File.new('addtrust_ca.pem')) 
store.add_cert OpenSSL::X509::Certificate.new(File.new('utn.pem')) 
store.add_cert OpenSSL::X509::Certificate.new(File.new('user_first_ca.pem')) 
store.add_cert OpenSSL::X509::Certificate.new(File.new('xpiron.pem')) 
sock.cert_store = store 
sock.start do |http| 
    response = http.request(req) 
end 

Так я открыл https://myserver.com/Request.ashx запрос в хроме, нажал на маленький замок-значок, чтобы получить сведения о сертификате. Но я не могу найти файлы PEM для экспорта. Я вижу, что это сертификат COMODO. Я не владею сервером, поэтому мне нужно найти решение для этого на моей стороне.

ответ

2

вы можете отключить проверку сертификатов для данного экземпляра Net::HTTP:

stock.verify_mode = OpenSSL::SSL::VERIFY_NONE 

или вы можете отключить проверку SSL на глобальном уровне в вашем процессе с помощью:

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

Примечание: Ruby интерпретатор даст вам предупреждение эта константа уже инициализирована. Иногда вы можете получить жесткую ошибку. если это так, вы можете отменить назначение постоянная и инициализировать его еще раз, используя следующий код:

OpenSSL::SSL.send(:remove_const, :VERIFY_PEER) 
OpenSSL::SSL.const_set(:VERIFY_PEER, OpenSSL::SSL::VERIFY_NONE) 

Это не идеальное решение для вашей проблемы, но если безопасность не является большим cocern, вы можете использовать выше способы обойти SSL Проверка сертификата. Вы по-прежнему будете иметь зашифрованное безопасное соединение с сервером.

+0

Куда поместить второй? – Diego

+1

, если вы используете рельсы, вы добавляете его в инициализаторы. в противном случае вы можете поместить его куда угодно, пока вы его выполняете, прежде чем начать использовать «Net :: HTTP». после 'require 'net/http'' в вашем скрипте будет работать –

+0

' OpenSSL :: SSL :: VERIFY_PEER = OpenSSL :: SSL :: VERIFY_NONE' результаты с синтаксической ошибкой: 'dynamic constant assign' – bbozo

Смежные вопросы

 Смежные вопросы