J'essaie de tester un serveur qui fonctionne normalement dans le navigateur Web, avec l'option openssl s_client, le connecter directement en utilisant openssl renvoie la 400 Bad Request:
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:)
Important: J'ai déjà essayé de mettre l'en-tête Host:, le problème est que lorsque j'exécute GET, l'erreur se produit immédiatement, ne me laissant aucune chance d'inclure plus d'en-têtes. Remplacez example.com par mon hôte ...
echo
:echo -e "GET / HTTP/1.1\r\nHost: example.com.br\r\n\r\n" | openssl s_client ...
. C'est\r\n
important parce que c'est ce que la norme HTTP dit de faire. Deux paires CRLF à la fin de la demande sont également importantes car c'est ce que la norme dit de faire. Voir aussi Comment canaliser "echo" dans "openssl"?GET /index.html ...
ou vous devrez peut-être définir un cookie. Vous devriez probablement essayer aveccurl
ouwget
, et publier la demande et la réponse complètes , y compris l'erreur. Sinon, vous devez fournir un vrai nom de serveur et une URL afin que nous puissions exécuter les tests.Réponses:
Selon https://bz.apache.org/bugzilla/show_bug.cgi?id=60695 ma commande était:
où -crlf signifie, selon l'aide de la commande openssl,
-crlf - convertit LF du terminal en CRLF
Ensuite, je pouvais entrer des commandes multilignes et aucune "mauvaise demande" comme réponse après la première ligne de commande.
la source
OK avait la même chose moi-même et a pris un certain temps pour comprendre.
Je ne trouve pas de moyen d'envoyer plusieurs lignes dans la demande lors de l'utilisation interactive de s_client. Il envoie toujours la demande immédiatement dès que vous avez entré la première ligne. Si quelqu'un sait comment contourner cela, faites-le moi savoir!
Edit : Je vois que Wei He a publié la façon de le faire - utilisez le
-crlf
drapeau mais laissez cette réponse ici comme méthode alternative.En attendant, comme l'a suggéré jww, vous devez utiliser
echo
pour cela:Le problème suivant est que, par défaut, openssl ferme la connexion lorsque le fichier d'entrée se ferme. Ce qui se fait immédiatement lors de l'utilisation
echo
comme ceci. Donc, vous n'avez pas le temps de voir la réponse et voyez simplement la sortie DONE! :-(Vous pouvez ajouter un
sleep
à la commande echo pour contourner ce problème (notez que les crochets sont importants):Ou, mieux que cela, vous pouvez utiliser l'
-ign_eof
option pour laisser la connexion ouverte:Ou mieux encore, si vous ne vous souciez que des réponses HTTP, utilisez l'
-quite
option qui masque la plupart du bruit TLS et définit également cette option -ign_eof pour vous:la source
D'après ce que je peux voir, la 400 Bad Request est probablement liée à l'utilisation de HTTP / 1.1 dans votre ligne GET.
Avez-vous ajouté un en-tête "Host:" après la demande GET? Le RFC indique que pour HTTP / 1.1, un en-tête Host est requis:
https://www.ietf.org/rfc/rfc2616.txt
la source
Vous pouvez émettre une demande GET avec OpenSSL:
Notez que vous pouvez également utiliser "HTTP / 2", mais soyez prudent car certains serveurs (par exemple github.com) ne le prennent pas en charge.
la source