무료 SSL 인증서 적용하기 — Let’s Encrypt 사용법

무료 SSL 인증서 적용하기 — Let’s Encrypt 사용법

사이트에 도메인까지 연결했으면 그다음으로 해야 할 일이 SSL 인증서 적용입니다. SSL이 없으면 브라우저 주소창에 “주의 요함”이라는 경고가 뜨고, 사용자 입장에서는 이 사이트가 안전하지 않다는 인상을 받게 됩니다. 구글 검색 순위에도 영향을 주기 때문에 사실상 선택이 아니라 필수입니다. 예전에는 SSL 인증서가 유료였는데 지금은 Let’s Encrypt 덕분에 무료로 적용할 수 있습니다. 이번 글에서는 Let’s Encrypt가 무엇인지, 그리고 실제 서버에 어떻게 적용하는지를 정리해보겠습니다.

SSL 인증서가 필요한 이유

SSL 인증서가 하는 일은 간단합니다. 사용자의 브라우저와 서버 사이에 오가는 데이터를 암호화하는 겁니다. 로그인할 때 비밀번호를 입력하면 그 데이터가 네트워크를 타고 서버까지 갑니다. SSL이 없으면 이 데이터가 평문 그대로 전송되기 때문에 중간에 누군가 가로채면 그대로 노출됩니다. SSL이 적용되면 이 데이터가 암호화되어서 가로채더라도 내용을 알 수 없습니다.

눈에 보이는 차이도 있습니다. SSL이 적용된 사이트는 주소가 https로 시작하고 주소창에 자물쇠 아이콘이 표시됩니다. 반대로 SSL이 없으면 http로 시작하고 브라우저가 경고를 띄웁니다. 특히 크롬은 꽤 눈에 띄게 경고를 보여주기 때문에 방문자가 바로 뒤로가기를 누를 수도 있습니다.

Let’s Encrypt란 무엇인가

Let’s Encrypt는 비영리 기관인 ISRG(Internet Security Research Group)에서 운영하는 무료 SSL 인증서 발급 서비스입니다. 2016년에 정식 출시됐고 지금은 전 세계 수억 개 사이트에서 사용하고 있습니다.

유료 인증서와 암호화 수준 차이는 없습니다. 다만 유효기간이 90일이라서 주기적으로 갱신해야 한다는 차이가 있습니다. 이것도 자동 갱신 설정을 해두면 신경 쓸 일이 없습니다.

Let’s Encrypt 인증서를 발급받으려면 Certbot이라는 도구를 사용합니다. Certbot은 Let’s Encrypt에서 공식으로 권장하는 클라이언트 프로그램이고, 명령어 몇 줄이면 인증서 발급부터 웹 서버 설정까지 자동으로 처리해줍니다.

사전 준비 사항

Certbot을 실행하기 전에 확인해야 할 것들이 있습니다.

첫째, 도메인이 서버 IP에 정상적으로 연결되어 있어야 합니다. Let’s Encrypt는 인증서를 발급하기 전에 “이 도메인이 정말 이 서버의 것이 맞는지” 검증하는 과정을 거칩니다. 도메인으로 접속했을 때 서버에 도달할 수 있어야 검증이 통과됩니다. 이전 글에서 다룬 A레코드 설정이 완료되어 있어야 한다는 뜻입니다.

둘째, 서버에 웹 서버가 설치되어 있고 80번 포트가 열려 있어야 합니다. Certbot이 검증할 때 80번 포트를 사용하기 때문입니다. Nginx든 Apache든 하나는 설치되어 있어야 합니다.

셋째, 서버에 SSH로 접속할 수 있어야 합니다. Certbot은 서버 내부에서 직접 실행하는 도구이기 때문입니다.

Certbot 설치 방법

Ubuntu 서버를 기준으로 설명하겠습니다. 대부분의 클라우드 서버가 Ubuntu를 사용하니까 거의 그대로 따라 하실 수 있을 겁니다.

먼저 서버에 SSH로 접속한 다음 Certbot과 Nginx 플러그인을 설치합니다.

sudo apt update
sudo apt install certbot python3-certbot-nginx

Apache를 사용하고 있다면 python3-certbot-nginx 대신 python3-certbot-apache를 설치하면 됩니다. 이 글에서는 Nginx 기준으로 진행합니다.

설치가 끝나면 certbot 명령어가 사용 가능한 상태가 됩니다.

인증서 발급 실행

설치가 끝났으면 다음 명령어 하나로 인증서 발급과 Nginx 설정을 동시에 처리할 수 있습니다.

sudo certbot --nginx -d today-play.com -d www.today-play.com

여기서 -d 옵션 뒤에 오는 게 인증서를 적용할 도메인입니다. 루트 도메인과 www 도메인을 같이 넣어주는 게 좋습니다. 둘 다 넣어야 어떤 주소로 접속하든 https가 적용됩니다.

처음 실행하면 이메일 주소를 입력하라고 나옵니다. 인증서 만료 알림을 받을 주소를 입력하면 됩니다. 그다음 이용약관 동의 여부를 물어보고, HTTP 접속을 HTTPS로 자동 리다이렉트할지 물어봅니다. 리다이렉트는 설정하는 게 좋습니다. 사용자가 http로 접속해도 자동으로 https로 넘어가게 해줍니다.

모든 과정이 끝나면 “Congratulations!”라는 메시지가 나오고 인증서가 적용됩니다. 브라우저에서 https://todayfunplay.com으로 접속해서 자물쇠 아이콘이 뜨는지 확인하면 됩니다.

Certbot이 실제로 하는 일

명령어 한 줄이면 끝나기 때문에 내부에서 뭘 하는 건지 궁금할 수 있습니다. Certbot은 크게 세 가지를 처리합니다.

먼저 도메인 소유권 검증을 합니다. Let’s Encrypt 서버가 내 도메인으로 HTTP 요청을 보내서 Certbot이 미리 만들어둔 임시 파일에 접근할 수 있는지 확인합니다. 접근이 되면 “이 서버가 이 도메인을 가지고 있다”고 판단합니다.

검증이 통과되면 인증서 파일을 발급받아서 서버에 저장합니다. 보통 /etc/letsencrypt/live/도메인명/ 경로에 저장됩니다.

마지막으로 Nginx 설정 파일을 수정해서 SSL 관련 설정을 자동으로 추가합니다. 인증서 파일 경로, SSL 프로토콜 버전, 리다이렉트 규칙 같은 것들을 알아서 넣어줍니다.

자동 갱신 설정

Let’s Encrypt 인증서는 90일마다 만료됩니다. 만료되면 다시 “주의 요함” 경고가 뜨기 때문에 갱신을 까먹으면 안 됩니다.

다행히 Certbot을 설치하면 자동 갱신 타이머가 같이 설정되는 경우가 많습니다. 확인하려면 이렇게 입력합니다.

sudo systemctl status certbot.timer

active 상태로 나오면 자동 갱신이 이미 동작하고 있는 겁니다. 만약 비활성화되어 있다면 직접 크론탭에 등록할 수 있습니다.

sudo crontab -e

파일이 열리면 맨 아래에 다음 줄을 추가합니다.

0 3 * * * certbot renew --quiet

이렇게 하면 매일 새벽 3시에 인증서 만료 여부를 확인하고, 만료가 가까우면 자동으로 갱신합니다. –quiet 옵션은 갱신할 게 없을 때 아무 출력도 하지 않게 하는 옵션입니다.

갱신이 제대로 되는지 미리 테스트해보고 싶으면 다음 명령어를 사용합니다.

sudo certbot renew --dry-run

dry-run은 실제로 갱신하지 않고 과정만 시뮬레이션하는 겁니다. 여기서 에러가 나지 않으면 실제 갱신도 문제없이 될 겁니다.

적용 후 확인하는 방법

인증서를 적용했으면 제대로 동작하는지 확인해야 합니다. 가장 간단한 방법은 브라우저에서 직접 접속해보는 겁니다. 주소창에 자물쇠 아이콘이 뜨고 인증서 정보를 클릭했을 때 Let’s Encrypt가 발급한 인증서로 나오면 정상입니다.

터미널에서 확인하고 싶으면 이렇게 입력합니다.

curl -I https://todayfunplay.com

응답 헤더에 HTTP/2 200이 나오면 SSL이 정상 동작하고 있는 겁니다. 만약 연결이 안 되면 443번 포트가 열려 있는지 먼저 확인해보세요.

좀 더 자세한 인증서 상태를 보고 싶으면 SSL Labs(ssllabs.com/ssltest)에서 도메인을 입력하면 인증서 등급부터 보안 설정까지 상세하게 분석해줍니다.

자주 겪는 문제와 해결법

Certbot 실행 중에 에러가 나는 경우가 종종 있습니다.

가장 흔한 건 “Could not automatically find a matching server block”이라는 에러입니다. 이건 Nginx 설정 파일에 server_name이 도메인과 일치하지 않을 때 나옵니다. /etc/nginx/sites-available/default 파일을 열어서 server_name 부분에 자기 도메인이 들어가 있는지 확인하면 됩니다.

두 번째로 흔한 건 검증 실패입니다. “Challenge failed” 같은 메시지가 나오면 도메인이 서버 IP를 제대로 가리키고 있는지, 80번 포트가 열려 있는지, Nginx가 실행 중인지를 확인해야 합니다. DNS 설정을 방금 변경했다면 아직 전파가 안 됐을 수도 있으니 좀 기다렸다가 다시 시도해보는 것도 방법입니다.

세 번째는 “Too many requests” 에러입니다. Let’s Encrypt는 같은 도메인에 대해 일주일에 발급할 수 있는 인증서 수에 제한이 있습니다. 테스트를 반복하다가 이 제한에 걸리면 일주일 정도 기다려야 합니다. 그래서 테스트할 때는 –staging 옵션을 붙여서 테스트용 인증서로 먼저 확인하는 게 좋습니다.

마무리

Let’s Encrypt와 Certbot 덕분에 SSL 인증서 적용이 정말 쉬워졌습니다. 서버에 접속해서 명령어 두세 줄이면 끝나고, 자동 갱신까지 설정해두면 그 이후로는 신경 쓸 일이 거의 없습니다. 도메인 연결까지 끝낸 상태라면 바로 적용해보시길 권합니다. 다음 글에서는 웹 서버를 선택할 때 많이 비교하게 되는 Nginx와 Apache의 차이를 정리해보겠습니다.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *