팀프로젝트를 하며 처음으로 SSL
인증서를 발급받아 https
로 배포를 해보았는데
API 요청을 받았을 때 이런 오류를 맞이하게 되었다.
너무 이상했던 것은 이 오류가 뜨기 전 API 요청과 응답이 정상적으로 되고 있었고,
당시 프론트/백 모두 휴식 기간을 가지며 코드를 수정한 적이 없었는데 갑자기 오류가 발생했다.
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
에러 로그도 살펴보았다.
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
오류의 원인은 다음과 같다.
- 보안에 취약한
SSL
프로토콜을 사용하고 있거나, 취약한 암호묶음을 사용하고 있을 경우- 서버에서 응답한
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
: