Knotenanforderung - Fehler "SSL23_GET_SERVER_HELLO: unbekanntes Protokoll" erhalten

72

Ich verwende das Knotenanforderungsmodul , sende regelmäßig GET-Anforderungen an eine Reihe von URLs und erhalte manchmal auf einigen Websites den folgenden Fehler.

Error: 29472:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:openssl\ssl\s23_clnt.c:683

Das Problem ist, dass ich diesen Fehler nicht immer oder immer bei einigen URLs bekomme, nur manchmal. Außerdem kann es mit " strictSSL: false" nicht ignoriert werden .

Ich habe gelesen, dass dies damit zusammenhängen kann, dass ich SSL-Anforderungen mit dem falschen Protokoll (SSLv2, SSLv3, TLS ..) sende. Dies erklärt jedoch nicht, warum dies unregelmäßig geschieht.

Übrigens führe ich nodejs auf einem Win 2008-Server aus.

Jede Hilfe wird geschätzt.

umutm
quelle
Was passiert, wenn Sie einige Sekunden später dieselben URLs erneut versuchen?
Generalhenry
1
Wenige Sekunden später erhalte ich keine Fehler. Die Fehler werden nur manchmal zurückgegeben.
Umutm

Antworten:

112

Sie erhalten eine solche Fehlermeldung, wenn Sie eine HTTPS-Ressource über einen falschen Port anfordern, z. B. 80. Stellen Sie daher sicher, dass Sie in den Anforderungsoptionen den richtigen Port 443 angegeben haben.

Gaf King
quelle
Hatte gerade dieses Problem mit Docker, hatte in meinem Docker-Compose: Ports: - "443: 80"
IAmJulianAcosta
17

Das war total mein schlechtes.

Ich habe den Standardknoten http.request für einen Teil des Codes verwendet, der Anforderungen nur an http-Adressen senden soll. Anscheinend hatte die Datenbank eine einzelne https-Adresse, die mit einem zufälligen Intervall abgefragt wurde.

Ich habe einfach versucht, eine http-Anfrage an https zu senden.

umutm
quelle
6
Der Fehler sieht eher so aus, als würde eine https-Anfrage an den http-Port gesendet.
Michael Krelin - Hacker
2
Die Fehlermeldung zeigt deutlich, dass Sie HTTPS, dh SSL, verwendet haben und dass der Server Ihnen eine Meldung "Unbekanntes Protokoll" gesendet hat, auch in SSL. Sie sprechen weder HTTP noch HTTPS mit Datenbanken. Antwort macht keinen Sinn.
Marquis von Lorne
6

Ich habe diesen Fehler erhalten, weil ich dort verwendet habe, require('https')wo ich hätte verwenden sollen require('http').

Ben
quelle
4

Einige der Sites sprechen SSLv2 oder senden zumindest einen SSLv2-Server - Hallo, und Ihr Client spricht kein SSLv2 oder ist nicht für das Sprechen konfiguriert. Hier müssen Sie eine politische Entscheidung treffen. SSLv2 sollte vor Jahren vom Erdboden verschwunden sein, und Standorte, die es noch verwenden, sind unsicher. Wenn Sie jedoch mit ihnen sprechen müssen, müssen Sie es nur an Ihrem Ende aktivieren, wenn Sie können. Ich würde mich jedoch bei den Eigentümern der Website beschweren, wenn Sie können.

Marquis von Lorne
quelle
Obwohl der Fehler so klingt, ist nicht sicher, ob dies der Fall ist, wenn man bedenkt, dass dieselbe URL manchmal diesen Fehler zurückgibt. Übrigens, gibt es bei einer Knotenanforderung eine Möglichkeit, sowohl SSLv2 als auch SSLv3 zu aktivieren? Oder sollte ich dies auf Windows-Betriebssystemebene tun?
Umutm
Das könnte passieren, wenn die Site eine Farm ist und es unterschiedliche SSL-Level in verschiedenen Elementen gibt: Das wäre ein verrücktes Setup, aber wenn es überhaupt SSLv2 gibt, ist es bereits verrückt. Ich kann Sie nicht zu node.js beraten, aber es wird eindeutig OpenSSL unter der Haube verwendet, und OpenSSL ist hochgradig konfigurierbar. Ich würde jedoch zuerst die fraglichen Websites untersuchen. Sie möchten SSLv2 an Ihrem Ende nicht ohne guten Grund aktivieren.
Marquis von Lorne
1
Ich konnte das Problem immer noch nicht genau identifizieren. Sobald dies erledigt ist, werde ich diesen Eintrag aktualisieren.
Umutm
1
@umutm 4 Jahre später ist dies immer noch ein Problem. Den gleichen Fehler bekommen.
Dojo
@Dojo Ab Node v4 + empfehle ich die Verwendung der Node-Standardeinstellung (SSLv23_method), da diese meiner Erfahrung nach die maximale Kompatibilität aufweist. Darüber hinaus wird die SSLv3-Unterstützung in Nodejs eingestellt. Wenn die angeforderte Website SSLv3 erwartet, kann dies das Problem sein.
Umutm
4

Ich hatte dieses Problem (403 Fehler für jedes Paket) und fand im Internet nichts Großartiges, um es zu lösen. Meine .npmrcDatei in meinem Benutzerordner war falsch und wurde missverstanden. Ich habe diese npmrc-Zeile von geändert

proxy=http://XX.XX.XXX.XXX:XXX/

zu:

proxy = XX.XX.XXX.XXX:XXXX
Flament Mickaël
quelle
Ich danke dir sehr! Ich wurde verrückt. Dies war auch das Problem .net Core (Linux) (funktioniert aber in Java): Export http_proxy = xxxx: 8888 Export https_proxy = xxxx: 8888
dtroy
2
var https = require('https');
https.globalAgent.options.secureProtocol = 'SSLv3_method';
user3180229
quelle
1
habe mein Problem nicht gelöst, aber nützliche Informationen tho
keinabel
1
SSLv3 ist gefährlich und veraltet ... verwenden Sie stattdessen SecureProtocol: "TLSv1_method"
Scott Stensland
0

Ich habe diesen Fehler beim Herstellen einer Verbindung zu Amazon RDS erhalten. Ich habe den Serverstatus zu 50% der CPU-Auslastung überprüft, als es sich um einen Entwicklungsserver handelte und niemand ihn verwendet.

Es hat vorher funktioniert und nichts in der Verbindungskonfiguration hat sich geändert. Ein Neustart des Servers hat das Problem für mich behoben.

Diaa Kasem
quelle
0

Kurz gesagt,

vi ~/.proxy_info

export http_proxy=<username>:<password>@<proxy>:8080
export https_proxy=<username>:<password>@<proxy>:8080

source ~/.proxy_info

Hoffe das hilft jemandem in Eile :)

Prateek Mishra
quelle
Dies erklärt nicht, warum der Vorschlag das Problem lösen könnte.
Richlv
0

In meinem Fall (die Website SSL verwendet ev-Kurven) wurde das Problem mit dem SSL durch Hinzufügen dieser Option ecdhCurve behoben: 'P-521: P-384: P-256'

request({ url, 
   agentOptions: { ecdhCurve: 'P-521:P-384:P-256', }
}, (err,res,body) => {
...

JFYI, vielleicht hilft das jemandem

Denisix
quelle
0

Ich habe diesen Fehler erhalten, als ich ihn auf meinem Rocketchat verwendet habe, um mit meinem Gitlab über einen Enterprise-Proxy zu kommunizieren.

Weil das https: //: 8080 verwendet wurde, aber tatsächlich funktionierte es für http: //: 8080

MohanBabu
quelle