구현 - HTTPS TLS/SSL Certificate

공부의 기록·2022년 8월 12일
1

Nginx

목록 보기
6/7
post-thumbnail

Intro

이 문서는 총 3 단계로 이루어진 구현 파트의 두 번째에 해당합니다.

이 과정을 통해서 Nginx 를 이용해서 HTTPS 를 구현하는 방법을 학습할 수 있습니다.

구체적으로...

해당 과정을 통해서 80번 포트, HTTP 로 들어온 요청을 TLS/SSL 암호화를 하여 443번 포트, HTTPS 로 넘겨줄 수 있게 됩니다.

시작하기 전에...

이 문서는 시리즈로 이어지고 있습니다. 따라서, 원활한 진행을 위해서 사전 과정을 따라 오시는 것을 추천해드립니다.

  1. EC2 Instance 및 AWS 보안그룹 사전 설정은 이 포스트 를 참고해주세요.
  2. Nginx 와 Reverse Proxy Server 에 대한 설명은 이 포스트 를 참고해주세요.
  3. Nginx 와 TLS/SSL 인증과 HTTPS 에 대한 설명은 이 포스트 를 참고해주세요.

단, 구현 파트의 첫 번째는 단순한 Nginx 의 체험에 불과하므로, 한 번 이상 사용해 보셨다면 패스하셔도 무관할 것 같습니다.

시작하기 위해서...

본 과정을 이수하기 위해서는 DNS 시스템에 등록된 도메인 과 도메인 인증 기관이 필요합니다.
다음의 무료 제공 업체 혹은 별도의 업체를 사용하시면 이 코스를 따라갈 수 있을 것입니다.

  1. 무료 도메인 발급 서비스 https://www.noip.com/
  2. 무료 SSL 인증서 발급 서비스 https://letsencrypt.org/ko/
  3. 인증 프로그램 https://certbot.eff.org/

Get Started

이번 실습은 ubuntu 22.04 에서 이루어지고 있습니다.

자세한 내용은 다음 프로젝트의 저장소 링크 를 클릭하셔서 ### ✔ 진행 절차

이번에는 apt 라는 패키지 관리 매니저를 사용할 것입니다. 직전에 사용한 apt-get 보다 조금 더 빠르고 안정적인 친구이며 더 자세한 내용은 이 포스트 를 참고해주세요.

🎉 Nginx

다음 명령어로 관리자 계정 으로 전환하세요.

sudo -s

ubuntu 패키지 관리 매니저인 apt 를 업데이트하고 nginx 를 설치해주세요.

sudo apt update
sudo apt install nginx

service + nginx 로 사용할 수 있는 명령어는 다음과 같습니다.

명령어기능
sudo nginx -t/etc/nginx/nginx.conf 파일이 정규 문법을 맞춰서 작성되었는 지, 테스트합니다.
sudo service nginx start/etc/nginx/nginx.conf 를 기반으로 nginx 의 server 를 실행시킵니다.
sudo service nginx stopnginx 의 server 를 종료시킵니다.
sudo service nginx restartnginx 의 server 를 종료 후 실행 시킵니다.
sudo service nginx reloadnginx 의 server 를 실행을 유지한 채, 설정 파일 값만 새로 고침 해서 반영 시킵니다.

🔧 Firewall

Nginx 가 서비스 엑세스 권한을 터득하기 위해서는 방화벽 소프트웨어를 구성해야 합니다. 이번에는 ufw 라고 불리는 초심자를 위한 방화벽 솔루션을 사용할 생각입니다. 더 자세한 정보가 필요하시다면 이 포스트 를 참고하시길 바랍니다.

ubuntu 22.04 에서는 ufw 가 비활성화 상태일 것입니다. 다음의 명령어를 입력해서 확인해주세요.

sudo ufw status

만약 inactice 상태라면 다음의 명령어로 활성화 시켜주세요.

sudo ufw enable

ufw 가 활성화 되고 나면 다음의 항목을 활성화 시켜주세요.

sudo ufw allow 'OpenSSH'
sudo ufw allow 'Nginx HTTP'

🔧 systemctl vs service

방화벽 설정이 끝나면 다음의 systemctl 명령어를 사용해서 Nginx 서버를 가동 시킬 수 있습니다. 이 명령어는 service 계열 명령어 보다 더 강력하고 세세한 제어 권한을 설정할 수 있는 명령어 입니다.

systemctl status nginx

systemctl + nginx 로 사용할 수 있는 명령어는 다음과 같습니다.

명령어기능
sudo systemctl stop nginx서버를 중지 시킵니다.
sudo systemctl start nginx서버를 가동 시킵니다.
sudo systemctl restart nginx서버를 재가동 시킵니다.
sudo systemctl reload nginx가동 중인 서버를 새로고침 할 수 있습니다.
sudo systemctl disable nginxNginx 가 서버 실행 시 켜지지 않게 바꿉니다.
sudo systemctl enable nginxNginx 가 서버 실행 시 켜지도록 바꿉니다. (기본값)

🛠 certbot

ubuntu 22.04 에서는 기본 지원 되고 있는 스냅 패키지 를 이용해서 certbot 을 설치할 것 입니다.

일단, snapd 코어를 가장 최신 버전으로 업데이트 해줍니다.

sudo snap install core; sudo snap refresh core

이전 버전의 certbot 이 있다면 제거하고, certbot 을 설치해야 합니다.

sudo apt remove certbot
sudo snap install --classic certbot

최종적으로 certbot 이 다른 시스템 패키지와 충돌하지 않도록 링크 파일로 구성해야 합니다.

sudo ln -s /snap/bin/certbot /usr/bin/certbot

🎉 Nginx Config

위 과정을 따라했다면 다음의 두 핵심 파일이 자동으로 구성 됩니다.

  1. /etc/nginx/nginx.conf 파일
  2. /etc/nginx/sites-available/default 파일

각 폴더 및 파일에 대한 더 자세한 설명은 다음 포스트Step 6 - Nginx FIles and Directory 을 참고해주세요.

다음 명령어를 입력해서 nginx 실행 초기 파일을 열어 주세요.

sudo nano /etc/nginx/nginx.conf

해당 파일의 주된 변경점은 다음과 같습니다.

  1. server_names_hash_bucket_size 64 항목을 주석 해제해 주세요.
  2. default_type application/octet-stream;default_type application/json 으로 변경해주세요.

다음 명렬어를 입력해서, 해당 디렉토리로 진입해주세요.

cd /etc/nginx/sites-available

ls 명령어를 입력하면 파일 및 폴더 목록을 확인할 수 있습니다.

해당 경로에는 default 라는 기본 서버 파일이 존재합니다.

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        server_name _;

        location / {
                try_files $uri $uri/ =404;
        }
}

이제 해당 파일을 삭제하고 본격적으로 HTTPS 서버 구현을 위한 절차에 들어가겠습니다.

sudo rm /etc/nginx/sites-available/default

🎉 Certbot

현재, /etc/nginx/sites-available/default 를 제거한 상태이므로, 다음의 명령어를 입력해서 SSL 인증서를 발급 받으면 자연스럽게 default 파일이 생성됩니다.

sudo certbot --nginx -d 도메인-주소

또한 다음의 명령어를 통해서 certbot 자동 갱신을 설정하고 확인할 수 있습니다.

sudo systemctl status snap.certbot.renew.service
sudo certbot renew --dry-run

마지막으로 다음과 같이 bypass 설정을 더하는 것으로 default 파일을 변경하고 나면 서버가 정상적으로 실행이 됩니다. 자세한 내용은 이 GitHub 문서 를 참고해주세요.

server {

    root /var/www/도메인주소/html/;
    index index.html index.htm index.nginx-debian.html;

    server_name 도메인주소;

    location / {

            try_files $uri $uri/ =404;

    }


    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/도메인주소/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/도메인주소/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {

    listen 80;
    listen [::]:80;

    server_name 도메인주소;

    root /var/www/도메인주소/html;

    location / {
            return 301 https://도메인주소$request_uri;
    }

}

References

profile
2022년 12월 9일 부터 노션 페이지에서 작성을 이어가고 있습니다.

0개의 댓글