Let's Encrypt를 사용하여 HTTPS 설정하기
보안상의 이유로 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 로 바로 전환하는 것을 자물쇠 표시로 확인할 수 있다.