Estou tentando testar um servidor que está funcionando normalmente no navegador da web, com a opção openssl s_client, conectando-o diretamente usando o openssl retorna a 400 Solicitação inválida:
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:)
Importante: Eu já tentei colocar o cabeçalho Host:, o fato é que, quando executo GET, o erro ocorre imediatamente, não me deixando chance de incluir mais cabeçalhos. Substitua example.com pelo meu host ...
echo
:echo -e "GET / HTTP/1.1\r\nHost: example.com.br\r\n\r\n" | openssl s_client ...
. O\r\n
é significativo porque é isso que o padrão HTTP diz para fazer. Dois pares de CRLF no final da solicitação também são significativos porque é isso que o padrão diz para fazer. Veja também Como você canaliza "eco" para "openssl"?GET /index.html ...
ou pode definir um cookie. Você provavelmente deve tentar comcurl
ouwget
, e postar o pleno pedido e resposta, incluindo o erro. Caso contrário, você precisará fornecer um nome e um URL reais do servidor para que possamos executar os testes.Respostas:
De acordo com https://bz.apache.org/bugzilla/show_bug.cgi?id=60695, meu comando era:
onde -crlf significa, de acordo com a ajuda do comando openssl,
-crlf - converte LF do terminal em CRLF
Depois, pude inserir comandos com várias linhas e nenhum "pedido inválido" como resposta após a primeira linha de comando.
fonte
OK tinha a mesma coisa e demorou um pouco para descobrir.
Não consigo encontrar uma maneira de enviar várias linhas na solicitação ao usar s_client interativamente. Ele sempre envia a solicitação imediatamente assim que você entra na primeira linha. Se alguém souber como contornar isso, entre em contato!
Edit : Eu vejo Wei Ele postou o caminho para fazer isso - use a
-crlf
bandeira, mas deixando esta resposta aqui como um método alternativo.Enquanto isso, como jww sugeriu, você deve usar
echo
para isso:O próximo problema é que, por padrão, o openssl fecha a conexão quando o arquivo de entrada é fechado. O que acontece imediatamente quando se usa
echo
assim. Então você não tem tempo para ver a resposta e, em vez disso, apenas vê a saída DONE! :-(Você pode adicionar um
sleep
ao comando echo para contornar isso (observe que os colchetes são importantes):Ou, melhor que isso, você pode usar a
-ign_eof
opção para deixar a conexão aberta:Ou melhor ainda, se você está preocupado apenas com as respostas HTTP, use a
-quite
opção que oculta a maior parte do ruído TLS e também define a opção -ign_eof para você:fonte
Pelo que posso ver, é provável que o 400 Bad Request esteja relacionado ao uso de HTTP / 1.1 na sua linha GET.
Você adicionou um cabeçalho "Host:" após a solicitação GET? O RFC afirma que, para HTTP / 1.1, é necessário um cabeçalho Host:
https://www.ietf.org/rfc/rfc2616.txt
fonte
Você pode emitir uma solicitação GET com o OpenSSL:
Observe que você também pode usar "HTTP / 2", mas tenha cuidado porque alguns servidores (por exemplo, github.com) não são compatíveis.
fonte