상세 컨텐츠

본문 제목

[ubuntu] apache2 SSL 적용 - Let’s Encrypt

서버

by HAK LEE 2019. 12. 13. 20:32

본문

 

보안이 중요해지면서 웹 페이지에 SSL 적용이 거의 필수가 됐다. 네이버, 카카오, 다음 등 우리가 흔히 들어가는 페이지는 모두 적용이 되어있고, 당신이 보고 있는 이 페이지도 SSL이 적용되어있다!

막상 본인이 만든 웹서버에 SSL을 적용하는 일은 결코 쉬운 일은 아니다. 본인도 처음에는 꽤 많이 헤맸다. (..)


1. Let's Encrypt?

Let's Encrypt는 비영리 인터넷 보안 연구 그룹 (ISRG)에서 가져온 무료, 자동 및 공개 인증 기관입니다.

이쪽 사이트에서 더 자세한 설명을 볼 수 있다.


2. 서버에 Let's Encrypt 설치

먼저 터미널을 켜고, 아래와 같이 입력하여 패키지를 설치하자. 아, 그리고 이제 root 권한으로 진행해야 한다.

$ sudo apt-get install letsencrypt

설치가 완료되었다면 인증서를 다운받자. 아래와 같은 형식으로 입력하면 된다.

$ letsencrypt certonly --webroot --webroot-path=/var/www/html -d [DOMAIN]

DOMAINlatteishorse.net와 같은 링크를 입력하자. --webroot-path= 부분은 아파치 서버의 기본 패치를 입력하면 된다. (기본은 /var/www/html)

위와 같이 사용자에게 요청하는 질문이 세 개다. 간단하게 설명하자면,
1. 갱신과 보안 관련 사항을 전달받을 이메일을 입력 - EMAIL
2. 약관을 읽고 ACME 서버에 등록하기 위해 동의 - Y
3. 스팸 이메일 수신 동의 - N

IMPORTANT NOTES가 나온다면 성공한 거다. 인증서가 저장된 위치는 /etc/letsencrypt/live/[DOMAIN] 혹시 모르니깐 들어가서 인증서가 잘 있는지 확인해보자. ls를 입력했을 때 당신의 도메인 폴더가 나온다면 성공.

$ cd /etc/letsencrypt/live

 


3. SSL 적용

SSL 적용은 3단계로 이루어진다.
#1 웹서버에 인증서 추가
#2 인증서가 추가됐음을 알리기
#3 웹서버 재부팅

#1 웹서버에 인증서 추가

$ cd /etc/apache2/sites-available

우리가 들어갈 부분은 이곳. ls 눌러보면 000-default.confdefault-ssl.conf 두 개가 나오면 정상이다.
여기서 우리가 필요한건 default-ssl.conf, 아래 코드로 vi 에디터를 열자.

$ vi default-ssl.conf

처음 열면 엄청난 양의 주석이 반겨준다. 위는 주석을 모두 제거한 상태.
여기서 가장 중요한 부분은 SSLEngine on부터 그 아래 세줄이다. 입력을 하기 위해서는 a를 누르면 된다.

SSLCertificateFile /etc/letsencrypt/live/DOMAIN/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/DOMAIN/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/DOMAIN/chain.pem

SSLEngine on은 기본으로 활성화되어있다. 아래 세 줄은 직접 입력해주어야 한다. 위의 내용을 그대로 붙여넣고 DOMAIN 부분만 변경하는 것을 추천한다. (오타가 하나라도 나면 웹서버 재시작이 안 되고, 오류 찾기가 힘들다 ㅠㅠ)

모두 수정하였으면 [esc] 버튼 한번 누르자. INSERT 모드에서 보기 모드로 변경된다. 이 상태에서 :wq 를 입력하면 저장된다. (root 계정으로 수정하지 않았다면 저장이 안될 거다. :q를 누른 후 root 계정으로 다시 수정하자.)

#2 인증서가 추가됐음을 알리기

그 다음으로 해야할 것은 Let's Encrypt를 소개하는 블로그마다 말이 다 다른데, 아래와 같이 해야된다.

$ a2ensite default-ssl.conf

Site default-ssl already enabled라고 떠야 정상적으로 적용이 된거다.

$ a2enmod ssl

위의 코드로 ssl 모듈을 로드하자.

이렇게 모듈이 enabled 되었다고 하면 성공.

#3 웹서버 재부팅

이제 모든 준비는 끝났다. 아래 코드를 입력해 서버를 재시작하자.

$ service apache2 restart

재시작 과정에서 오류가 안 뜬다면 정상적으로 적용이 된 것이다. 당신의 웹 사이트에 https를 붙여서 접속해보자.
만약 오류가 뜬다면? 분명 default-ssl.conf를 수정하는 과정에서 무엇인가를 잘못 건든 것이다.
https://fishpoint.tistory.com/2123 이 링크에 오류를 해결하는 방법이 잘 나와있다.

만약 재시작은 정상적으로 잘 되었는데 홈페이지가 접속되지 않는다면?
서버의 인바운드에서 443 포트를 허용했는지 확인해보자.


4. HTTP > HTTPS 리다이렉션

http로 접속을 했을 때 https가 붙은 링크로 이동시켜주면 더 좋을 것 같다는 생각이 들 거다. 터미널에서 아래와 같이 이동하자.

$ cd /etc/apache2/sites-available

이 번에는 default-ssl.conf 말고 000-default.conf를 열어보자.

$ vi 000-default.conf

맨 아래 </VirtualHost> 줄의 바로 위에 아래의 코드를 추가하자. 물론 DOMAIN에는 본인의 홈페이지 주소를 넣어주면 된다.

<Location />
    RedirectMatch /(.*)$ https://DOMAIN/$1
</Location>

 

첫줄 <Location />이 맞다

이렇게 입력하고 :wq를 통해 저장했다면 웹서버를 재시작하자.

$ service apache2 restart

5. 주기적으로 인증서 갱신

이렇게 발급받은 인증서가 항상 유효한 것은 아니다. 따라서 우리는 인증서를 주기적으로 갱신해야 한다. 하지만 언제 갱신해야 하는지도 모를뿐더러 기억하기도 힘들다. Crontab을 이용해 인증서를 주기적으로 갱신해주자.

주기 설정은 아래와 같이 했다.

분 (0-59) 시간 (0-23) 일 (1-31) 월 (1-12) 요일 (0-7)
0 5 1 * *

*은 항상 실행되는 것을 의미한다. 따라서 매월 1일 5시 0분에 실행한다는 의미이다.

$ crontab -e

Crontab을 작성하기 위해 위와 같이 입력하면 에디터를 선택하라는 창이 뜬다. 1번을 눌러 nano 에디터로 열고 아래와 같이 입력하자.

0 5 1 * * /usr/bin/letsencrypt renew >> /var/log/le-renew.log
5 5 1 * * /usr/sbin/service apache2 reload

>> 는 작업을 진행하면서 발생하는 로그를 le-renew.log에 저장하라는 의미이고, 5분 뒤에 아파치 서버를 reload 해서 인증서를 적용하게 된다.

이렇게 입력하면 된다. ^X → Y → [enter] → [enter] 순으로 진행하면 저장이 완료된다.


참고한 글

관련글 더보기