2017-08-16 2 views
1

J'essaye de connecter un webcrawler qui accède à un certain site via SSL et interroge mes données sur ce site. L'authentification de ce site s'effectue via un certificat numérique auto-signé. Au moment où je veux accéder au site, je télécharge ce certificat au format .pfx vers mon API, je le convertis en .pem, et quand j'essaye d'accéder au site avec ce certificat, la réponse vient avec le statut 403 (interdit). Cependant, lorsque j'essaie d'accéder au site via un navigateur avec le certificat au format .pfx, je l'obtiens généralement. J'ai déjà essayé d'utiliser Mechanize, et cela a fonctionné pendant un moment (jusqu'à il y a quelques mois cela a fonctionné), mais cela a commencé à donner l'erreur: SSL_connect returned = 1 errno = 0 state = SSLv3 read finished A: sslv3 alert bad certificate Le site est ancien, il ne reçoit pas fréquemment les mises à jour. Après cela, j'ai déjà essayé d'utiliser le net/http lib et l'erreur persistait, j'ai essayé d'utiliser la gemme httprb et enfin j'ai essayé avec Faraday. Toutes les tentatives se sont terminées par l'erreur citée ci-dessus ou par le statut de réponse == 403. Que puis-je faire pour pouvoir me connecter? Y a-t-il un problème avec mon script? Est-ce qu'il manque des informations dont j'ai besoin?Ruby - Se connecter avec SSL et s'authentifier via le certificat client - sslv3 alerte mauvais certificat

code:

# Faraday customs method: 

class FaradayHttp 
    def with_openssl 
    system "openssl pkcs12 -in my-certificate-path -out certificate-output-path -nodes -password pass:certificate-password" 

    def cert_object 
     OpenSSL::X509::Certificate.new File.read("certificate-output-path") 
    end 

    # create PKey 
    def key_object 
     OpenSSL::PKey.read File.read("certificate-output-path") 
    end 


    faraday = Faraday::Connection.new 'https://example-site.com', 
    :ssl => { 
     certificate: cert_object, 
     private_key: key_object, 
     version: :SSLv3, 
     verify: false 
    } 
    faraday 
    end 
end 

# Controller that try to connect with the ssl server: 

agent = FaradayHttp.new.with_openssl 
page = agent.get '/login_path' 

Répondre

0
# mypki will prompt you for certificates 
require 'mypki' 

# faraday will use certificates from mypki 
require 'faraday' 

faraday = Faraday::Connection.new 'https://example-site.com' 
faraday.get '/login_path'