2011-12-19 13 views
23

Questo è il codice che sto utilizzando per connettersi al sito SSL.Perché l'accesso a un sito SSL con Mechanize su Windows non riesce, ma su Mac funziona?

require 'mechanize' 
a = Mechanize.new 
page = a.get 'https://site.com' 

I "m usando usando rubino 1.9.3 e Mechanize 2.1pre1 + dipendenze Su Mac il codice precedente funziona e restituisce la pagina su Windows 7 che eseguono le stesse versioni mi dà il seguente errore:..

OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 
read server certificate B: certificate verify failed 

Ripristino di meccanizzare 2.0.1 sembra risolvere questo problema, ma ho quindi ottenere afflitto il problema too many connections reset by peer. Così che non è una soluzione.

ho provato a fare a.verify_mode = false, ma che non lo fanno qualsiasi cosa. Ho letto che puoi rn disattivare la verifica SSL utilizzando:

open(uri,:ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE) 

Come posso disattivarlo in Mechanize? Perché ricevo questo errore solo su Windows?

risposta

38

La versione di OpenSSL (la libreria utilizzata per stabilire connessioni sicure con Net::HTTPS) non è in grado di trovare correttamente la catena di certificati nel computer.

A nostro giudizio, OpenSSL non è mai stato in grado di utilizzare lo storage cert di Windows installato per convalidare i server remoti, quindi non funziona a causa di ciò.

dal vostro esempio, si può fare:

a.agent.http.verify_mode = OpenSSL::SSL::VERIFY_NONE 

Per evitare la verifica, tuttavia, che è ben lungi dall'essere ideale (problemi di sicurezza evidenti dovuti)

vi consiglio di scaricare alcuni fasci CERT (come il quelli di ricciolo):

http://curl.haxx.se/ca

e modificare il codice per qualcosa di simile:

require "rbconfig" 
require "mechanize" 

a = Mechanize.new 

# conditionally set certificate under Windows 
# http://blog.emptyway.com/2009/11/03/proper-way-to-detect-windows-platform-in-ruby/ 
if RbConfig::CONFIG["host_os"] =~ /mingw|mswin/ 
    # http://curl.haxx.se/ca 
    ca_path = File.expand_path "~/Tools/bin/curl-ca-bundle.crt" 

    a.agent.http.ca_file = ca_path 
end 

page = a.get "https://github.com/" 

che sembra funzionare, Ruby 1.9.3-p0 (i386-mingw32), Windows 7 x64 e meccanizzare 2.1.pre.1

Speranza che aiuta.

+0

Se si sta testando SSL di un host noto controllando se è valido non è necessario. Finché la crittografia è ancora valida? Sapresti come aggiungere questo condizionatamente se la piattaforma è Windows? –

+0

@KassymDorsel ha aggiornato il codice per utilizzare la piattaforma condizionale, sperando che sia di aiuto. –

+2

Ho usato a.agent.http.verify_mode = OpenSSL :: SSL :: VERIFY_NONE per molti progetti, ma ora quando uso la stessa cosa non ha effetto. Sto ancora ricevendo l'errore SSL 'OpenSSL :: SSL :: Errore SSLError: SSL_connect restituito = 1 errno = 0 stato = SSLv2/v3 server di lettura ciao A: (null)' mentre in altri progetti funziona bene ... ruby ​​1.9. 2 e rails 3.2.0 – RAJ

6

risposta Luis' guarda bene, ma più in generale:

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE 
+0

Evitare di fare VERIFY_NONE, che vanifica lo scopo dell'utilizzo di HTTPS/SSL in primo luogo se non si sta verificando l'altra parte. Se ci stiamo connettendo tramite un proxy trasparente o un DNS modificato che ti reindirizza verso un luogo che è falso quello vero, non lo saprai mai ... –

+6

Sì, ma generalmente non ti importa di queste cose quando raschi una pagina web. – pguardiario

+0

Si ottiene sempre lo stesso errore 'OpenSSL :: SSL :: Errore SSLError: SSL_connect restituito = 1 errno = 0 stato = SSLv2/v3 server di lettura ciao A: (null)' – RAJ

Problemi correlati