Saya mencoba menguji server yang berfungsi normal di browser web, dengan opsi openssl s_client, menghubungkannya langsung menggunakan openssl mengembalikan 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:)
Penting: Saya sudah mencoba untuk menempatkan Host: header, masalahnya adalah ketika saya menjalankan GET, kesalahan terjadi segera meninggalkan saya tidak ada kesempatan untuk memasukkan lebih banyak header. Ganti example.com dengan host saya ...
echo
:echo -e "GET / HTTP/1.1\r\nHost: example.com.br\r\n\r\n" | openssl s_client ...
. Ini\r\n
penting karena itulah yang dikatakan standar HTTP untuk dilakukan. Dua pasangan CRLF di akhir permintaan juga penting karena itulah yang dikatakan standar. Juga lihat Bagaimana Anda memasukkan "gema" ke "openssl"?GET /index.html ...
atau Anda mungkin perlu mengatur cookie. Anda mungkin harus mencoba dengancurl
atauwget
, dan posting penuh permintaan dan respon, termasuk kesalahan. Jika tidak, Anda harus memberikan nama server dan URL nyata sehingga kami dapat menjalankan tes.Jawaban:
Menurut https://bz.apache.org/bugzilla/show_bug.cgi?id=60695 perintah saya adalah:
di mana -crlf berarti, sesuai dengan bantuan perintah openssl,
-crlf - mengkonversi LF dari terminal ke CRLF
Lalu saya bisa memasukkan perintah multiline dan tidak ada "permintaan buruk" sebagai respons setelah commandline pertama lagi.
sumber
OK memiliki hal yang sama sendiri dan butuh waktu untuk mencari tahu.
Saya tidak dapat menemukan cara untuk mengirim beberapa baris dalam permintaan saat menggunakan s_client secara interaktif. Selalu mengirim permintaan segera setelah Anda memasukkan baris pertama. Jika seseorang tahu bagaimana menyiasatinya, tolong beri tahu saya!
Sunting : Saya melihat Wei Dia telah memposting cara untuk melakukan ini - gunakan
-crlf
bendera tetapi meninggalkan jawaban ini di sini sebagai metode alternatif.Sementara itu, seperti yang disarankan jww, Anda harus menggunakan
echo
ini:Masalah berikutnya adalah bahwa secara default openssl menutup koneksi ketika file input ditutup. Yang mana tidak langsung saat menggunakan
echo
seperti ini. Jadi Anda tidak punya waktu untuk melihat responsnya dan sebaliknya hanya melihat hasil DIBUAT! :-(Anda dapat menambahkan
sleep
perintah echo untuk menyiasatinya (perhatikan tanda kurung penting):Atau, lebih baik dari itu, Anda dapat menggunakan
-ign_eof
opsi untuk membiarkan koneksi terbuka:Atau lebih baik lagi, jika Anda hanya peduli dengan respons HTTP maka gunakan
-quite
opsi yang menyembunyikan sebagian besar kebisingan TLS dan juga setel opsi -ign_eof untuk Anda:sumber
Dari apa yang saya lihat, 400 Permintaan Buruk kemungkinan terkait dengan penggunaan HTTP / 1.1 di baris GET Anda.
Apakah Anda menambahkan header "Host:" setelah permintaan GET? RFC menyatakan bahwa untuk HTTP / 1.1, header Host diperlukan:
https://www.ietf.org/rfc/rfc2616.txt
sumber
Anda dapat mengeluarkan permintaan GET dengan OpenSSL:
Perhatikan bahwa Anda juga dapat menggunakan "HTTP / 2", tetapi berhati-hatilah karena beberapa server (mis. Github.com) tidak mendukungnya.
sumber