Ich versuche, einen Server zu testen, der im Webbrowser normal funktioniert, mit der Option openssl s_client. Wenn ich ihn direkt mit openssl verbinde, wird die 400 Bad Request zurückgegeben:
openssl s_client -servername example.com -connect example.com:443 -tls1
(some information about the certificate)
GET / HTTP/1.1
(and the error occurs **immediately** - no time to include more headers like Host:)
Wichtig: Ich habe bereits versucht, den Host: -Header zu setzen. Wenn ich GET ausführe, tritt der Fehler sofort auf, sodass ich keine Chance mehr habe, weitere Header einzuschließen. Ersetzen Sie example.com durch meinen Host ...
echo
:echo -e "GET / HTTP/1.1\r\nHost: example.com.br\r\n\r\n" | openssl s_client ...
. Das\r\n
ist wichtig, weil der HTTP-Standard dies vorschreibt. Zwei CRLF-Paare am Ende der Anforderung sind ebenfalls von Bedeutung, da der Standard dies vorschreibt. Siehe auch Wie leitet man "Echo" in "openssl"?GET /index.html ...
Sie ein Cookie setzen oder ein Cookie setzen. Sie sollten es wahrscheinlich mitcurl
oder versuchenwget
und die vollständige Anfrage und Antwort einschließlich des Fehlers veröffentlichen. Andernfalls müssen Sie einen echten Servernamen und eine URL angeben, damit wir die Tests ausführen können.Antworten:
Laut https://bz.apache.org/bugzilla/show_bug.cgi?id=60695 war mein Befehl:
wobei -crlf laut Hilfe des Befehls openssl bedeutet,
-crlf - LF vom Terminal in CRLF konvertieren
Dann konnte ich mehrzeilige Befehle und keine "schlechte Anfrage" als Antwort nach der ersten Kommandozeile mehr eingeben.
quelle
OK hatte das gleiche selbst und brauchte eine Weile, um es herauszufinden.
Ich kann keine Möglichkeit finden, mehrere Zeilen in der Anfrage zu senden, wenn s_client interaktiv verwendet wird. Die Anfrage wird immer sofort gesendet, sobald Sie die erste Zeile eingegeben haben. Wenn jemand weiß, wie man das umgeht, dann lass es mich wissen!
Bearbeiten : Ich sehe Wei Er hat den Weg dazu gepostet - benutze die
-crlf
Flagge, aber lasse diese Antwort hier als alternative Methode.In der Zwischenzeit müssen Sie, wie von jww vorgeschlagen, Folgendes verwenden
echo
:Das nächste Problem ist, dass openssl standardmäßig die Verbindung schließt, wenn die Eingabedatei geschlossen wird. Was bei sofortiger Verwendung sofort funktioniert
echo
. Sie haben also keine Zeit, die Antwort zu sehen, sondern nur die DONE-Ausgabe! :-(Sie können
sleep
dem Echo-Befehl ein hinzufügen , um dies zu umgehen (beachten Sie, dass die Klammern wichtig sind):Oder, besser noch, Sie können die
-ign_eof
Option verwenden, um die Verbindung offen zu lassen:Oder noch besser, wenn Sie sich nur mit den HTTP-Antworten befassen, verwenden Sie die
-quite
Option, die den größten Teil des TLS-Rauschens verbirgt und die Option -ign_eof für Sie festlegt:quelle
Soweit ich sehen kann, hängt die 400 Bad Request wahrscheinlich mit der Verwendung von HTTP / 1.1 in Ihrer GET-Leitung zusammen.
Haben Sie nach der GET-Anforderung einen "Host:" - Header hinzugefügt? Der RFC gibt an, dass für HTTP / 1.1 ein Host-Header erforderlich ist:
https://www.ietf.org/rfc/rfc2616.txt
quelle
Sie können eine GET-Anfrage mit OpenSSL stellen:
Beachten Sie, dass Sie auch "HTTP / 2" verwenden können. Seien Sie jedoch vorsichtig, da einige Server (z. B. github.com) dies nicht unterstützen.
quelle