Web

Let's Encrypt를 사용하여 HTTPS 설정하기

도도9 2020. 8. 9. 21:15

보안상의 이유로 https를 사용하는 것이 중요하기도 하지만 사용하려는 기능이 https를 필요로해서일 때도 있다. 

본인은 web push 기능을 구현하기 위해서 설정해야했다. 

 

여러 튜토리얼들을 돌았는데 Let's Encrypt를 사용하는 것이 제일 간단한 것 같다. 

 

준비물:

IP주소가 아니라 도메인 이름

Apache

 

설치 과정 

도메인 이름이 있으면 과정은 어렵지 않다. 참고로 그냥 실습이 목적이라면 freenom 에서 간단하게 도메인 이름을 설정할 수 있다. 이제 아래 명령어들을 입력해서 certbot 등 let's encrypt에 필요한 것들을 설치하면 된다. 

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
sudo apt-get install python-certbot-apache

 

위처럼 설치할 때에 아무런 에러가 뜨지 않는다면 최선이지만 혹시 'sudo add-apt-repository universe' 명령어를 입력했을 때 에러가 떴다면 나는 개인적으로 아래의 명령어들로 해결했다. 

cd /usr/lib/python3/dist-packages/
sudo cp apt_pkg.cpython-35m-x86_64-linux-gnu.so apt_pkg.so

 

Apache 설정 파일 수정

만약에 도메인 이름을 설정한지 얼마 되지 않았다면 아파치 conf 파일에 아래에 두번 째 줄처럼 서버 이름을 적어주어야 한다. 그리고 WSGI 관련된 부분들을 주석처리 해준다. 

<VirtualHost *:80>
	ServerName www.webpush.tk <---- 이렇게 추가
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        <Directory /home/dodo/project/django_project/photo/photo>
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>

        #WSGIDaemonProcess photo python-path=/home/dodo/project/django_project python-home=/home/dodo/.virtualenvs/new_django
        #WSGIProcessGroup photo
        #WSGIScriptAlias / /home/dodo/project/django_project/photo/photo/wsgi.py

</VirtualHost>

 

Let's Encrypt

이제 아래 명령어로 Let's Encrypt를 사용해보자

sudo certbot --apache

그러면 아래처럼 해당 주소에 HTTPS를 활성화할 건지 물어본다. 여기서부터 몇가지 설정에 필요한 질문들을 물어보는데 필요한데로 답하면 된다. 이 과정이 다 끝난다면 아파치 conf 파일이 수정되고 해당 conf 파일의 이름에 '-le-ssl.conf' 가 붙은 새로운 파일이 생성된 것을 확인할 수가 있다. 

 

예를 들어서, 기존에 사용하던 000-default.conf 파일은 아래처럼 변할 것이다. Rewrite 관련된 부분들이 https로 바로 갈 수 있도록 설정되어 있다. 참고로 나는 위 let's encrypt 과정에서 http로 접속하면 바로 https로 redirect되게 설정했다. 나는 tutorial을 따라서 directory 부분은 없애주었다. 

#000-default.conf
<VirtualHost *:80>
	ServerName www.webpush.tk <---- 이렇게 추가
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        #WSGIDaemonProcess photo python-path=/home/dodo/project/django_project python-home=/home/dodo/.virtualenvs/new_django
        #WSGIProcessGroup photo
        #WSGIScriptAlias / /home/dodo/project/django_project/photo/photo/wsgi.py
        
        RewriteEngine on
        RewriteCond %{SERVER_NAME} =www.webpush123.tk
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

</VirtualHost>

새로 생긴 000-default-le-ssl.conf 파일도 조금 손 볼 필요가 있다. 일단 기존의 conf 파일과 많이 다른 부분은 없지만 Rewrite 부분이 없고 대신 SSLCertificate 부분이 있는 것을 관찰할 수 있다. 이제 WSGI 부분들의 주석처리를 풀어주면 된다. 따라서 아래와 같은 결과가 된다. 

<VirtualHost *:80>
	ServerName www.webpush.tk
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        <Directory /home/dodo/project/django_project/photo/photo>
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>

        WSGIDaemonProcess photo python-path=/home/dodo/project/django_project python-home=/home/dodo/.virtualenvs/new_django
        WSGIProcessGroup photo
        WSGIScriptAlias / /home/dodo/project/django_project/photo/photo/wsgi.py
        
        SSLCertificateFile /etc/letsencrypt/live/www.webpush123.tk/fullchain.pem
	SSLCertificateKeyFile /etc/letsencrypt/live/www.webpush123.tk/privkey.pem
	Include /etc/letsencrypt/options-ssl-apache.conf

</VirtualHost>

 

마무리

이제 아래 명령어로 apache가 제대로 작동하는지 확인해 보고 방화벽이 https를 허용하도록 설정해주면 된다. 

sudo apachectl configtest
sudo ufw allow https
sudo service apache2 restart

이제 해당 페이지에 들어가보면 https 로 바로 전환하는 것을 자물쇠 표시로 확인할 수 있다. 

 

참고

https://www.youtube.com/watch?v=NhidVhNHfeU&t=707s