Openssl 명령 s_client는 항상 400 잘못된 요청을 표시합니다.

Openssl 명령 s_client는 항상 400 잘못된 요청을 표시합니다.

openssl s_client 옵션을 사용하여 웹 브라우저에서 제대로 작동하는 서버를 테스트하려고하는데 openssl을 사용하여 직접 연결하면 400 잘못된 요청이 반환됩니다.

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:)

중요: Host: 헤더를 넣으려고 했는데 문제는 GET을 실행할 때 오류가 즉시 발생하여 더 많은 헤더를 포함할 기회가 없다는 것입니다. example.com을 내 호스트로 바꾸세요...

답변1

~에 따르면https://bz.apache.org/bugzilla/show_bug.cgi?id=60695내 명령은 다음과 같습니다

openssl s_client -crlf -connect www.pgxperts.com:443

여기서 -crlf는 openssl 명령의 도움에 따라 다음을 의미합니다.

-crlf - LF를 터미널에서 CRLF로 변환합니다.

그런 다음 여러 줄 명령을 입력할 수 있으며 첫 번째 명령줄 이후에는 더 이상 "잘못된 요청"이라는 응답이 없습니다.

답변2

글쎄요, 저도 똑같은 일을 겪었고 그것을 알아내는 데 시간이 좀 걸렸습니다.

s_client를 대화형으로 사용할 때 요청에서 여러 행을 보내는 방법을 찾을 수 없습니다. 항상 첫 번째 줄을 입력하자마자 즉시 요청을 보냅니다. 이 문제를 해결하는 방법을 아는 사람이 있으면 알려주시기 바랍니다!

편집하다:Wei He가 플래그를 사용하여 이를 수행하는 방법을 게시했지만 -crlf대안으로 여기에 이 ​​답변을 남겨 둘 것입니다.

그동안 jww가 제안한 대로 다음을 사용해야 합니다 echo.

echo -e "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | openssl s_client ...

다음 문제는 기본적으로 openssl이 입력 파일이 닫힐 때 연결을 닫는다는 것입니다. echo이와 같이 사용하면 즉시 실행됩니다. 따라서 응답을 볼 시간이 없으며 DONE 출력만 볼 수 있습니다! :-(

echo 명령에 a를 추가하면 이 문제를 해결할 수 있습니다 sleep(대괄호가 중요합니다).

(echo -e "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"; sleep 10) | openssl s_client ...

또는 이 -ign_eof옵션을 사용하여 연결을 열어둘 수도 있습니다.

echo -e "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | openssl s_client -ign_eof ...

또는 HTTP 응답에만 관심이 있다면 -quiet대부분의 TLS 노이즈를 숨기고 -ign_eof 옵션을 설정하는 옵션을 사용하는 것이 더 좋습니다.

echo -e "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | openssl s_client -quiet ...

답변3

OpenSSL을 사용하여 GET 요청을 할 수 있습니다.

openssl s_client -quiet -connect cdn.sstatic.net:443 <<eof
GET /stackexchange/js/universal-login.js HTTP/1.1
Connection: close
Host: cdn.sstatic.net

eof

"HTTP/2"를 사용할 수도 있지만 일부 서버(예: github.com)에서는 이를 지원하지 않으므로 주의하세요.

답변4

내가 이해한 바로는 400 Bad Request는 GET 라인의 HTTP/1.1 사용과 관련이 있을 가능성이 높습니다.

GET 요청 뒤에 "Host:" 헤더를 추가했나요? RFC에는 HTTP/1.1의 경우 Host 헤더가 필요하다고 명시되어 있습니다.

https://www.ietf.org/rfc/rfc2616.txt

19.6.1.1 멀티홈 웹 서버 단순화 및 IP 주소 변경 사항 저장

가장 중요한 요구 사항에는 Host 요청 헤더에 대한 클라이언트 및 서버 지원, Host 요청 헤더가 HTTP/1.1 요청에서 누락된 경우 오류 보고(섹션 14.23) 및 절대 URI 허용(섹션 5.1.2)이 포함됩니다. 이 사양의 정의가 변경되었습니다.

관련 정보