web-dev-qa-db-fra.com

OpenSSL :: SSL :: SSLError: SSL_connect retourné = 1 errno = 0 état = état inconnu: protocole inconnu

J'ai suivi de nombreux messages concernant ce problème et aucun d'eux n'a aidé. J'essaie de me connecter en utilisant les commandes irb les plus simples:

require 'open-uri'
open ('https://aristo4stu3.bgu.ac.il')

La chose étrange est que pour tout autre uri https que j'ai essayé, cela a bien fonctionné (c'est-à-dire https://google.com ).

À des fins de débogage, j'ai même essayé de désactiver la vérification SSL en utilisant:

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

ce qui ne semblait pas aider non plus.

Ma configuration est (sur AWS):

$ rvm -v

rvm 1.21.3 (stable) by Wayne E. Seguin <[email protected]>, Michal Papis <[email protected]> [https://rvm.io/]

$ Ruby -v
Ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux]

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 13.04
Release:    13.04
Codename:   raring

Journal complet:

2.0.0-p247 :001 > require 'open-uri'
 => true 
2.0.0-p247 :002 > open('https://aristo4stu3.bgu.ac.il')
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=unknown state: (null)
    from /home/ubuntu/.rvm/rubies/Ruby-2.0.0-p247/lib/Ruby/2.0.0/net/http.rb:918:in `connect'
    from /home/ubuntu/.rvm/rubies/Ruby-2.0.0-p247/lib/Ruby/2.0.0/net/http.rb:918:in `block in connect'
    from /home/ubuntu/.rvm/rubies/Ruby-2.0.0-p247/lib/Ruby/2.0.0/timeout.rb:52:in `timeout'
    from /home/ubuntu/.rvm/rubies/Ruby-2.0.0-p247/lib/Ruby/2.0.0/net/http.rb:918:in `connect'
    from /home/ubuntu/.rvm/rubies/Ruby-2.0.0-p247/lib/Ruby/2.0.0/net/http.rb:862:in `do_start'
    from /home/ubuntu/.rvm/rubies/Ruby-2.0.0-p247/lib/Ruby/2.0.0/net/http.rb:851:in `start'
    from /home/ubuntu/.rvm/rubies/Ruby-2.0.0-p247/lib/Ruby/2.0.0/open-uri.rb:313:in `open_http'
    from /home/ubuntu/.rvm/rubies/Ruby-2.0.0-p247/lib/Ruby/2.0.0/open-uri.rb:708:in `buffer_open'
    from /home/ubuntu/.rvm/rubies/Ruby-2.0.0-p247/lib/Ruby/2.0.0/open-uri.rb:210:in `block in open_loop'
    from /home/ubuntu/.rvm/rubies/Ruby-2.0.0-p247/lib/Ruby/2.0.0/open-uri.rb:208:in `catch'
    from /home/ubuntu/.rvm/rubies/Ruby-2.0.0-p247/lib/Ruby/2.0.0/open-uri.rb:208:in `open_loop'
    from /home/ubuntu/.rvm/rubies/Ruby-2.0.0-p247/lib/Ruby/2.0.0/open-uri.rb:149:in `open_uri'
    from /home/ubuntu/.rvm/rubies/Ruby-2.0.0-p247/lib/Ruby/2.0.0/open-uri.rb:688:in `open'
    from /home/ubuntu/.rvm/rubies/Ruby-2.0.0-p247/lib/Ruby/2.0.0/open-uri.rb:34:in `open'
    from (irb):2
    from /home/ubuntu/.rvm/rubies/Ruby-2.0.0-p247/bin/irb:16:in `<main>'
11
Rizon

Le problème semble être que votre site cible, aristo4stu3.bgu.ac.il, est pointilleux sur la négociation SSL/TLS. J'ai obtenu deux résultats différents avec la commande OpenSSL suivante avec différentes versions d'OpenSSL:

openssl s_client -connect aristo4stu3.bgu.ac.il:443

Cela se connecte avec le stock OpenSSL 0.9.8x sur OS X 10.7.5. Cependant, il ne pas se connecte en utilisant OpenSSL 1.0.1e - dans ce cas, le serveur ferme simplement la connexion (en envoyant une alerte Close Notify) immédiatement après avoir reçu le client Hello.

J'ai capturé des paquets avec Wireshark, et la différence entre ce que ces deux versions envoient est que 0.9.8x envoie un support publicitaire SSLv2 Client Hello via TLS 1.0, tandis que 1.0.1e envoie un support publicitaire TLSv1 Client Hello via TLS 1.2.

Si je dis à 1.0.1e de ne pas utiliser TLS:

openssl s_client -connect aristo4stu3.bgu.ac.il:443 -no_tls1

Cela se connecte avec succès à un support publicitaire SSLv3 Client Hello via SSL 3.0.

Par ailleurs, mon local Ruby établit une connexion réussie avec open-uri à votre site:

$ irb
>> require 'open-uri'
=> true
>> open('https://aristo4stu3.bgu.ac.il')
=> #<StringIO:0x10271fa90>
>> require 'openssl'
=> false
>> OpenSSL::OPENSSL_VERSION
=> "OpenSSL 0.9.8r 8 Feb 2011"
>>

Les approches indiquées semblent donc être:

  1. Mettez à niveau le serveur pour gérer plus de variantes Client Hello, ou
  2. Installez un Ruby qui utilise une ancienne bibliothèque OpenSSL, ou
  3. Modifiez votre programme pour envoyer un autre client Bonjour.

Il ne semble pas que le open-uri le module a une option pour définir la version SSL/TLS utilisée pour communiquer. Si vous ne pouvez pas modifier le serveur, vous devrez peut-être utiliser un module ou une bibliothèque différent pour établir la connexion, ou peut-être trouver un moyen de patcher le module openssl afin qu'il utilise un client Hello différent.

17
rhashimoto

Si vous êtes sur Mac et qu'il s'agit d'un problème de certificat OSX (ce qui était le cas pour moi), vous pouvez le résoudre en exécutant:

rvm osx-ssl-certs update all

Voir https://rvm.io/support/fixing-broken-ssl-certificates

4
pcv

J'ai trouvé un bon résumé du problème et de la solution ici. http://blog.55minutes.com/2012/05/tls-error-with-Ruby-client-and-Tomcat-server/

Extrait de code TLDR qui résout le problème.

http = Net::HTTP.new(Host, port)
http.use_ssl = true
http.ssl_version = :SSLv3
http.start { ... }
3
Hopsoft

J'ai reçu le même message et il s'est avéré que j'avais http.use_ssl = true défini sur une connexion non SSL.

3
user1756254