[Spring + Nginx + SSL] Invalid character found in method name, SSL handshake failed 오류

Jinny·2023년 12월 5일
1

Trouble Shooting

목록 보기
7/8

💣 Trouble Shooting

상황

팀프로젝트를 하며 처음으로 SSL 인증서를 발급받아 https로 배포를 해보았는데
API 요청을 받았을 때 이런 오류를 맞이하게 되었다.

너무 이상했던 것은 이 오류가 뜨기 전 API 요청과 응답이 정상적으로 되고 있었고,
당시 프론트/백 모두 휴식 기간을 가지며 코드를 수정한 적이 없었는데 갑자기 오류가 발생했다.

Spring 에러 로그

o.apache.coyote.http11.Http11Processor   : Error parsing HTTP request header
 Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.

java.lang.IllegalArgumentException: Invalid character found in method name 
// 생략
. HTTP method names must be tokens

구글링을 해보니 대부분 "https가 활성화되지 않았는데 https로 요청하면 발생할 수 있는 오류로, http로 요청하면 해결된다" 고 하는데 우리 상황에는 맞지 않은 것 같았다.

왜냐면 프론트/백 모두 코드를 수정하지 않았고 오류가 뜨기 전까지는 https로 통신했기 때문이다.

그래도 혹시 몰라 http로도 요청해보았는데 그래도 안됐다.
아 참고로 Postman으로는 http/https 모두 통신 가능했다.

도대체 뭐가 문제일까...?

WAS 앞단에 Nginx가 있어 Nginx 에러 로그도 살펴보았다.

Nginx 에러 로그

SSL_do_handshake() failed (SSL: error:141CF06C:SSL routines:tls_parse_ctos_key_share:bad key share) while SSL handshaking

Spring 단의 에러 로그만 봤을 때는 도대체 무슨 오류인지 감이 잡히지 않았는데,
Nginx 오류를 보니 SSL 관련 오류인 것 같았다.

에러 메시지로 구글링을 해보고 있던 차에 프론트 분이 웹브라우저에서 뜨는 에러 메시지도 전달주셨다.

웹 브라우저 에러 메시지

웹 브라우저에서 이런 오류 메시지가 떴다고 한다.
(아쉽게도 스크린샷은 없었다 ㅠㅠ)

ERR_SSL_VERSION_OR_CIPHER_MISMATCH

이 에러 메시지까지 더해지니 SSL 관련 오류가 확실해보였다.
더불어 CIPHER라는 키워드까지 얻을 수 있었다!




원인

ERR_SSL_VERSION_OR_CIPHER_MISMATCH 오류의 원인은 다음과 같다.

  1. 보안에 취약한 SSL 프로토콜을 사용하고 있거나, 취약한 암호묶음을 사용하고 있을 경우
  2. 서버에서 응답한 Cipher Suites(암호화 형식)을 브라우저에서 처리 할 수 없는 경우

일단 보안에 취약한 SSL 프로토콜을 사용하고 있지는 않았다.
크롬 브라우저 기준 TLS 1.0 혹은 TLS 1.1의 경우 발생할 수 있으나,
우리 서버에서는 TLS 1.3을 사용하고 있었다.

그래서 Cipher Suites나 암호 묶음 관련 오류가 아닐까 추측했다.
아니면 클라이언트-서버의 프로토콜이 호환되지 않거나, 아니면 암호화 알고리즘 협상 과정에서 실패한 것으로 생각이 든다.
(Cipher Suites 관련해서는 공부를 좀 더 해보고 별도로 다시 정리할 예정이다.)




해결

관련해서 스택오버플로우 글을 참고해서 Nginx에 설정을 추가하니 해결되었다.

오류 해결은 됐지만 원인이 정확하게 파악이 되지 않아서 찝찝한 트러블 슈팅이었다.
https, SSL, Nignx 옵션, Cipher 등과 관련해서 공부를 좀 더 해봐야겠다.

server {
    // 생략
    
    ssl_prefer_server_ciphers   on;
    
    location / {
         // 생략
    }
}

ssl_prefer_server_ciphers 옵션
SSL/TLS 프로토콜에서 사용할 암호화 알고리즘을 지정하는 Nginx 옵션이다.
이 옵션은 클라이언트-서버 간 통신할 때 어떤 알고리즘을 사용할지에 대한 우선순위를 설정한다.

일반적으로 보안을 위해 on으로 설정하는 것이 권장된다.

  • on:
    • 서버 측의 암호화 알고리즘 우선순위에 따라 클라이언트의 제안을 무시하고 서버 측의 알고리즘을 사용
  • off:
    • 클라이언트가 제안한 알고리즘 중에서 서버가 가장 강력한 알고리즘을 선택



🔗 참고 링크

profile
공부는 마라톤이다. 한꺼번에 많은 것을 하다 지치지 말고 조금씩, 꾸준히, 자주하자.

0개의 댓글