Le code ci-dessous renvoie l'erreur suivante: OpenSSL :: SSL :: SSLError: SSL_connect SYSCALL retourné = 5 errno = 0 état = SSLv3 lecture serveur bonjour A
require 'net/https'
uri = URI.parse("https://<server>.com")
http = Net::HTTP.new(uri.Host, uri.port)
http.use_ssl = true
http.ssl_version = 'SSLv3'
http.get(uri.request_uri)
Une idée pourquoi? J'ai essayé tout ce qui est mentionné dans toutes les autres questions, toujours pas de chance.
Mise à jour I
J'ai essayé ce qui suit:
Mise à jour II
Toujours pas de chance.
Mise à jour III
D'accord, voici le code final - merci à Steffen (voir la réponse ci-dessous):
require 'net/https'
uri = URI.parse("https://<server>.com")
http = Net::HTTP.new(uri.Host, uri.port)
http.use_ssl = true
http.ssl_version = :TLSv1
http.ciphers = ['RC4-SHA']
http.get(uri.request_uri)
Je doute que ma question soit pertinente pour quiconque, car elle était liée à un serveur distant mal configuré.
Il s'agit d'un problème sur le site du serveur. Il semble que le serveur accepte exclusivement TLS 1.2 et n'affiche pas le comportement habituel lorsque le client demande quelque chose de moins (comme la rétrogradation ou l'envoi d'une alerte SSL) mais ferme simplement la connexion.
TLS 1.2 n'est pas pris en charge par OpenSSL 0.9.8 et, en outre, votre code applique SSLv3. Vous obtenez TLS 1.2 uniquement lors de la mise à niveau vers OpenSSL 1.0.1.
Certains navigateurs ne parviendront pas non plus à se connecter à ce serveur, même s'ils ont des moyens de contourner ces serveurs endommagés. Mais alors que Firefox essaiera seulement de rétrograder la connexion vers une version SSL moindre (ce qui aide souvent) Chrome parvient à se connecter avec TLS 1.2.
Edit: J'ai analysé le problème plus en profondeur et maintenant je ne peux plus obtenir de connexion avec TLS1.2 mais je peux obtenir une connexion avec TLS1.0 ou SSL3.0, mais uniquement si les chiffres sont codés en dur sur RC4-SHA. J'ai essayé d'autres comme AES128-SHA ou DES-CBC3-SHA et ils ne fonctionnent pas. Donc, même si cela ressemble à un système vraiment foiré définissant explicitement
http.ssl_version = 'TLSv1' -- or SSLv3, but TLSv1 is better
http.ssl_cipher = 'rc4-sha'
devrait marcher. Je ne suis pas un utilisateur Ruby donc la syntaxe exacte peut différer, mais j'ai testé avec OpenSSL s_client.
La solution consiste à passer à openssl 1.0.2g-1ubuntu4.6
(de 1.0.1f-1ubuntu2.21
) (par exemple à partir de cedar-14
à heroku-16
pile).
heroku stack:set heroku-16 -a your-app
Et en app.json
:
{
...
"stack": "heroku-16",
...
}