nginx SSL 오류해결방법 error:14094085,1408F092
안녕하세요. 리얼리눅스 입니다.
아래 오류는 SSL 핸드쉐이크 과정에서 CCS(Change Cipher Spec) 메시지가 예상보다 일찍 수신되었음을 나타냅니다. CCS 메시지는 TLS 암호화 모드로 전환할 것을 알리기위해 SSL 핸드쉐이크의 마지막 단계에서 전송되는 메시지입니다.
SSL_do_handshake() failed (SSL: error:14094085:SSL routines:SSL3_READ_BYTES:ccs received early) while SSL handshaking, client: 64.41.200.107, server: 0.0.0.0:443
그런데 예상보다 일찍 CCS 먼저 수신되었다는것은 현재 nginx 에서 지원하고 있는 TLS 버전과 브라우저에서 사용하는 TLS 버전이 맞지않아서 발생했을 가능성이 큽니다.
현재 nginx 설정(nginx.conf)을 기반으로 볼때 아래처럼 TLS v1.2 만 지원하고 있습니다.
ssl_protocols TLSv1.2;
따라서 아래와 같이 TLS 버전지원을 늘려서 다른 TLS 버전을 쓰는 클라이언트, 브라우저가 문제 없이 동작하도록 할 수 있습니다.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
실제 웹사이트 에서 TLS 버전을 정확히 어떻게 지원하고 있는지는 https://www.ssllabs.com/ssltest/analyze.html 위 사이트에 접속해서 확인 가능합니다.
사용하고 계신 도메인 웹사이트 주소를 입력해서 확인가능하고 확인결과는 아래로 스크롤하여 다음과 같이 확인 가능합니다.
본 예시는 리얼리눅스 웹사이트(https://reallinux.co.kr)에서 지원되고있는 TLS 버전을 보여주고 있습니다.
TLSv1 TLSv1.1 TLSv1.2 까지 지원하는 버전을 추가 해보는것을 추천드립니다. 다만 서버에서 사용중인 openssl 버전에 따라 사용가능한 TLS 버전이 제한될 수있으니 아래와 같이 버전 확인이 필요합니다. (openssl 버전 예시: v1.1.1)
$ openssl version OpenSSL 1.1.1 11 Sep 2018
참고로 TLSv1.1 및 매개 변수 TLSv1.2 는 OpenSSL 1.0.1 이상이 사용되는 경우에만 작동합니다. 매개 변수 TLSv1.3 는 OpenSSL 1.1.1 이상을 사용하는 경우에만 작동합니다.
두번째로 아래와 같은 SSL 에러는 SSL 핸드쉐이크 과정(연결과정) 중 SSL/TLS 라이브러리 내부적으로 TLS 레코드 데이터를 클라이언트로 부터 받는 처리가 있습니다. 이때 클라이언트로부터 수신한 데이터의 길이가 너무 길어서 처리하지 못했다는 것을 나타냅니다.
SSL_read() failed (SSL: error:1408F092:SSL routines:SSL3_GET_RECORD:data length too long) while waiting for request, client: 64.41.200.107, server: 0.0.0.0:443
하지만 실제 해당 에러는 사이드 이펙트로 발생한 "결과/현상" 으로 보이고 예상해봤을때 SSL 서버인증서,체인, 루트, 개인키 등의 문제일 수 도 있겠습니다. 지정한 설정은 통합된 pem 으로 아래와 같이 ssl_certificate 와 ssl_certificate_key 를 동일하게 설정했습니다. 하지만 해당 부분을 수정하는것을 추천드립니다.
ssl_certificate /etc/nginx/ssl/cert.pem; ssl_certificate_key /etc/nginx/ssl/cert.pem;
예를 들어 setigo 에서 받은 아래 3개의 파일을 기준(예시 도메인: example_com)으로
1. 서버인증서 : example_com.crt 파일
2. 중간인증서: example_com.ca-bundle 파일
3. 키(private key): example_com.key
위 첫번째, 두번째 인증서를 하나로 통합하고
$ cat example_com.crt example_com.ca-bundle > ssl-bundle.crt
아래와같이 세번째 키(private key)와 함께 nginx 설정(nginx.conf) 수정 하는것을 추천드립니다.
(참고로 인증서와 키 파일의 경로 /etc/nginx/ssl/example_com/ 를 수정이 필요합니다.)
ssl_certificate /etc/nginx/ssl/example_com/ssl-bundle.crt; ssl_certificate_key /etc/nginx/ssl/example_com/example_com.key;
그리고 나서 nginx 재시작 또는 리로드 를 진행하고 재점검 부탁 드리겠습니다.
감사합니다
리얼리눅스 관련 강의로는 "네트워크 완정정복" 수업을 추천 드립니다.
https://reallinux.co.kr/course/se_network