[트러블슈팅 - Nginx] cannot load certificate "/etc/letsencrypt/live/www.film-moa.com/fullchain.pem": BIO_new_file() failed...
|2025. 6. 5. 12:15
에러 메시지 / 문제 상황
Docker Compose로 Nginx 컨테이너 실행 시 다음과 같은 오류 발생함.
cannot load certificate "/etc/letsencrypt/live/www.film-moa.com/fullchain.pem": BIO_new_file() failed...
초기에는 페이지가 제대로 렌더링되지 않고 Nginx 기본 화면만 표시되거나 컨테이너가 반복적으로 종료되는 현상 발생함.
원인
- 최종 원인은 Nginx 컨테이너가 SSL 인증서 파일에 접근할 권한이 없어서 인증서를 불러오는 데 실패했던 것이었음
- 실제로 MobaXterm을 통해 파일 접근했을 때, /etc/letsencrypt까지는 접근이 되나, 이후 /live, /archive 디렉토리에는 접근이 불가했음 (Permission denied 에러)
- 호스트에서 /etc/letsencrypt/live/... 경로의 인증서 파일들은 심볼릭 링크로 구성되어 있는데,
- 실제 인증서 파일이 있는 /etc/letsencrypt/archive/... 경로에 대한 권한이 컨테이너 내부에서 부족했기 때문임.
시도
시도 1
인증서 파일명에 '1'이 붙은 문제를 의심하여 nginx.conf 수정
- 중간에 certbot문제라고 생각하여 인증서를 재설치했었음
sudo certbot --nginx -d www.film-moa.com -d film-moa.com
- /etc/letsencrypt/archive 폴더를 ls -l 명령어로 확인 시 파일명 뒤에 1이 붙어 있는 것을 확인하여 nginx.conf파일에 파일명을 수정함
변경전
# 2. HTTPS(443포트) 요청을 처리하는 서버 블록
server {
listen 443 ssl;
server_name www.film-moa.com film-moa.com;
ssl_certificate /etc/letsencrypt/live/www.film-moa.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.film-moa.com/privkey.pem;
... 중략 ...
}
변경후
# 2. HTTPS(443포트) 요청을 처리하는 서버 블록
server {
listen 443 ssl;
server_name www.film-moa.com film-moa.com;
ssl_certificate /etc/letsencrypt/live/www.film-moa.com/fullchain1.pem;
ssl_certificate_key /etc/letsencrypt/live/www.film-moa.com/privkey1.pem;
... 중략 ...
}
⇒ 그러나 여전히 같은 에러가 발생 BIO_new_file() failed
시도 2
시스템 nginx 프로세스 점유 의심 및 중지
- docker compose down 후 다시 컨테이너를 띄우고 log를 확인하니, 80포트가 이미 사용 중으로 나옴
- 포트 충돌 문제라고 판단해 프로세스를 강제 종료함
⇒ 그러나 여전히 같은 에러가 발생 BIO_new_file() failed
시도 3
심볼릭 링크 구조 및 실제 파일 존재하는지 접근하여 확인 & 권한 수정
- ls -l /etc/letsencrypt/live/www.film-moa.com/ 명령어로 심볼릭 링크 확인함.
- ls -l /etc/letsencrypt/archive/www.film-moa.com/ 명령어로 실제 타겟 파일 존재 여부 확인함.
- 그러나 일반 사용자(ubuntu)로 접근 시 권한 에러(Permission denied) 발생하는 것을 확인함.
- 컨테이너 내부에서 root가 아닌 별도의 사용자 계정으로 인증서를 읽으려 했기 때문에 문제가 발생했음을 최종적으로 확인함.
- 해당 경로에 대해 권한을 수정함
sudo chmod 755 /etc/letsencrypt
sudo chmod 755 /etc/letsencrypt/live
sudo chmod 755 /etc/letsencrypt/archive
sudo chmod 755 /etc/letsencrypt/live/www.film-moa.com
sudo chmod 755 /etc/letsencrypt/archive/www.film-moa.com
- 755
- 소유자(owner)는 읽기(r), 쓰기(w), 실행(x) 권한을 모두 갖고, 다른 사용자(group, others)는 읽기(r), 실행(x) 권한만 가지는 설정임.
해결책
컨테이너가 호스트의 /etc/letsencrypt 경로를 마운트하여 내부에서 접근할 때 권한이 충분한지 반드시 확인해야 함.
- 해결책으로 호스트에서 인증서가 있는 디렉터리(/etc/letsencrypt) 권한을 컨테이너에서 접근 가능한 형태로 변경하거나,
- 호스트에서 실제 인증서 파일을 복사하여 별도의 디렉토리에 배치하고, 이 디렉토리를 Docker 볼륨으로 마운트하는 방법으로 권한 문제 해결이 가능함.
- 본 프로젝트에서는 /etc/letsencrypt 경로의 접근 권한을 컨테이너가 읽을 수 있도록 수정하여 문제 해결함.
회고 및 정리
- 문제 발생 초기에 Nginx 설정 파일이나 포트 충돌 문제 등 명확한 문제를 찾는 데 많은 시간을 소모하였음.
- 여러 시도를 통해 문제를 좁혀갔으나, SSL 인증서 파일의 접근 권한 문제라는 근본적인 문제를 인지하는 데 시간이 오래 걸림.
- 앞으로 SSL과 같이 권한 설정이 중요한 부분을 다룰 때는, 처음부터 권한 문제를 염두에 두고 접근 권한 및 파일 소유자, 그룹 등의 설정을 우선적으로 확인할 필요가 있음을 깨달았음.
- 이를 통해 Docker 컨테이너와 호스트 간 볼륨 마운트 시 발생할 수 있는 권한 문제에 대한 이해도를 높였으며, 향후 유사 문제 발생 시 더 빠른 원인 진단이 가능할 것으로 기대함.