이번시간에는 우리가 저번 시간까지 구축한 서버의 보안을 위해 Let's encrypt를 이용해 HTTPS를 구축 해 볼 것이다.
HTTP
클라이언트와 서버 양쪽에서 통신할 수 있도록 하는 기본 통신 프로토콜이다. 앞서 인바운드 규칙 설정을 통해 HTTP 프로토콜의 포트인 80번 포트로 접속하도록 설정을 해놓았다. HTTP는 브라우저와 서버 사이에서 정보를 평문으로 전송하므로 정보가 전달되는 네트워크에서 전송되는 정보를 제 3자가 엿볼 수가 있다.
HTTPS
이처럼 제 3자가 엿보는 것을 예방하기 위해 클라이언트와 서버가 먼저 암호화 통신 채널을 설정한 다음 평문 HTTP 메시지를 전송함으로써 정보 유출을 막는 HTTPS가 등장했다. 암호화 채널은 SSL(TLS) 프로토콜을 사용해서 만든다.
Let's encrypt
Let's Encrypt는 무료의 TLS/SSL 인증서를 쉽게 가져오고 설치할 수 있는 방법을 제공하는 CA(인증 기관)으로, 웹 서버에서 암호화된 HTTPS를 무료로 이용할 수 있다. 이러한 방법은 사용자에게 Certbot라는 소프트웨어를 제공함으로써 구현한다.
먼저 Let's encrypt에서 제공하는 certbot을 설치하자.
$ sudo apt update
$ sudo apt upgrade
$ sudo add-apt-repository ppa:certbot/certbot #certbot을 위한 저장소 추가
$ sudo apt install python3-certbot-nginx
처음 참고한 블로그에선 python-certbot-nginx를 설치하는 코드였다. 하지만 'python-certbot-nginx has no installation candidate'라는 오류가 발생해서 찾아보았다. 이 글을 보시는 분들도 python이 오류 나면 python3으로 설치하시면 될 것이다.
$ sudo vi /etc/nginx/sites-available/default #nginx 기본 설정 파일
맨 처음 nginx와 phpinfo.php를 연결 할 때와 동일하게 nginx기본 설정 파일로 접속해서 설정을 해준다.
위 사진과 같이 server_name 옆에 내가 https를 구축하고 싶은 도메인을 작성해준다.
$ sudo service nginx restart #nginx 재시작
$ sudo ufw status # 방화벽 활성화 여부
파일 작성 후 설정 적용을 위해 nginx를 재시작 해준다.
Ubuntu에 있는 ufw라는 방화벽에서 https의 허용 설정을 원래는 해주어야 한다. 하지만 우리가 만든 aws 인스턴스 서버에는 ufw가 비활성화 되어있다고 한다. 따라서 skip
HTTPS를 구축하기 전에 먼저 aws 인스턴스에 접속해서 HTTPS의 연결도 받아들이게 인바운드 규칙을 변경해야 한다.
보안그룹 -> 인바운드 규칙 추가 -> 규칙 추가 -> 유형: HTTPS, 소스: anywhere -> 규칙저장 순으로 진행한다.
nginx플러그인을 통해 SSL 인증서를 취득 할 것이다.
# 원하는 도메인 지정해서 nginx 플러그인
$ sudo certbot --nginx -d johns-server.shop -d www.johns-server.shop
진행하다 보면 위 사진과 같이 https redirect (http로 접속해도 https로 접속 됨) 을 설정할 것이냐 물어보는 질문이 나온다. 필자는 2번 리다이렉트를 한다 라고 설정했다.
$ sudo service nignx restart
설정을 모두 완료해줬으니 nginx를 재시작한다.
https://johns-server.shop로 접속하면 위 사진과 같이 자물쇠가 걸려 있는 걸 볼 수 있다. 리다이렉트를 설정해 주었기 때문에 http://johns-server.shop으로 접속해도 자물쇠가 걸린다.