네트워크와 웹

Let's Encrypt로 진짜 무료 SSL/TLS 인증서 발급받기

캡스락 2020. 1. 3. 16:06

HTTP"S" 보안 연결에 사용되는 SSL/TLS 인증서

Let's Encrypt 를 통해 무료로 SSL 인증서를 발급받고, 아파치 웹서버에 발급받은 인증서를 연동하는 방법을 알아보겠습니다.

모든 설명은 제 서버 환경인 우분투에 아파치 서버를 기준으로 합니다.

1. certbot 설치

루트 권한으로 실행하세요
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository universe
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update

먼저 certbot이 업로드되어 있는 certbot ppa(저장소)를 등록해 줍니다.
이후 다음 명령어로 certbot을 설치합니다.

$ sudo apt-get install certbot python-certbot-apache

2-1. HTTP 웹서버를 이용한 인증

우선, 이 방법은 80번 포트로 들어오는 모든 요청을 433번 HTTPS로의 접속을 강제해둔 서버에는 적합하지 않습니다.

저도 이렇게 사용 중인데, 이러면 인증서 갱신을 위해 let's encrypt 측에서 443 번으로 리다이렉션 되면서 인증이 실패하게 됩니다.

먼저 'sudo systemctl stop apache2' 를 입력하여 실행중인 웹서버를 잠시 중단합니다.
이후, 다음 명령어로 인증서 발급을 진행하시면 됩니다.

$ sudo certbot certonly --standalone -d 도메인

크게 1. 이메일 주소 입력 > 2. 사용약관 동의 > 3. IP 주소 전송 동의 > 4. 완료 순으로 진행됩니다.
비록 영어지만 약관 동의 같은 부분은 대충 읽어봐도 알 수 있는 부분이므로 생략하고, 마지막 화면에서 인증서가 발급되었는지를 확인하시면 됩니다.

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/도메인/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/도메인/privkey.pem Your cert will expire on 만료일자
To obtain a new or tweaked version of this certificate in the future, simply run certbot again.
To non-interactively renew *all* of your certificates, run "certbot renew"

인증서 발급이 완료 화면에서는 인증서 저장 경로를 알려줍니다.
저장 경로 '/etc/letsecrypt/live/도메인/' 는 도메인 부분을 제외하면 누구나 같습니다.

인증서 발급이 완료하셨으면 3번으로 넘어가시면 됩니다.

2-2. DNS TXT 레코드를 이용한 인증

이 방법은 위 방법보다 서버를 덜 건드는 방법이긴 하나, DNS 레코드 수정을 자동화하려면 DNS 등록업체에서 네임서버 레코드 수정을 위한 API 를 제공해 주어야 가능한 방법입니다.

만약 별도의 그렇지 않다면 클라우드플레어 같은 무료 네임서버를 사용하는 방법(API 제공)과 자체 네임서버를 돌리는 방법이 있습니다만, 후자는 일이 너무 커지는 느낌이 들긴 합니다..ㅎㅎ

$ sudo certbot certonly --manual --preferred-challenges dns -d 도메인

역시 앞부분은 1번 방법과 같이 이용약관 동의에 관한 내용이므로 귀찮기 때문에 설명하지 않습니다.

다른 점은 서브도메인 '_acme-challenge' 의 TXT 레코드에 등록해야 할 인증키를 알려준다는 것입니다.

인증서 발급 중


화면에 표시된 값을 복사하시고, 도메인을 구매하신 업체의 홈페이지에서 '_acme-challenge' 라는 서브도메인을 생성하신 다음, 해당 서브도메인의 TXT 레코드의 내용으로 복사하신 값을 붙여넣기하면 됩니다.


변경사항을 저장하신 다음 이곳(클릭시 이동)에서 _acme-challenge.도메인의 레코드가 바뀌었는지 확인해 보실 수 있습니다.

dig 명령어


쉘에서 하고자 하시는 분은 dig txt _acme-challenge.도메인 을 입력하시면 됩니다.
확인하셨으면 다시 certbot 으로 돌아가셔서 새로고침하면 인증서 발급이 완료되었다고 나올 것입니다.
인증서는 1번 방법과 같이 '/etc/letsecrypt/live/도메인/' 디렉터리 내에 위치하게 됩니다.

3. 아파치에 인증서 등록

마지막으로 인증서를 연동해 보겠습니다.
먼저 '/etc/apache2/sites-enabled/default-ssl.conf' 파일을 열어서 굵은 글씨에 주의하며 주석을 제거하고 수정해 주도록 합니다.

ServerName 도메인
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/도메인/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/도메인/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/도메인/fullchain.pem

수정하셨다면 변경 내용을 다음 명령어로 활성화해 줍니다.

$ sudo a2ensite default-ssl


아직 잘 모르겠지만 경우에 따라 이 부분은 굳이 해 줄 필요는 없는 것 같기도 합니다.

제 짧은 추측으로는 apache2.conf 파일에 보면 기본값으로 'IncludeOptional sites-enabled/*.conf' 라고 되어 있기 때문인 것 같은데, 확실하진 않으니 일단 해 주겠습니다..ㅎㅎ

sudo systemctl restart apache2

이제 아파치를 재시작하여 변경 사항을 적용하도록 하겠습니다.

설정 변경 후 재시작 과정에서 오류가 생기는 원인은 대부분 오타가 있기 때문일 것이므로 수정했던 파일들을 다시 살펴보며 문제가 없는지 확인하시면 됩니다.

이때 'apachectl configtest' 또는 'apachectl -t' 명령을 활용하면 원인에 대한 보다 상세한 설명을 확인하실 수 있습니다.

재시작 완료 후 https://도메인 으로 접속하셔서 페이지가 정상적으로 표시된다면 주소창에서 초록색 자물쇠가 표시된 것도 확인하실 수 있으실 것입니다.

$ sudo ufw allow 443/tcp

만약 아파치 재시작에는 문제가 없으면서 접속이 되지 않는 경우라면 HTTPS 포트가 막혀 있는 것이 원인이 되는 경우가 많기 때문에 위 명령(ufw 방화벽 기준)을 통해 443 포트를 열어 주도록 합니다.
가정용 라우터의 포트포워딩 기능을 이용중이시거나 AWS와 같은 클라우드 환경이라면 해당 기기나 서비스의 자체 설정을 통해 추가로 443 포트를 열어야 할 수도 있습니다.

본문에서 잘못된 부분은 지적 부탁드립니다.
감사합니다.