DevOps/AWS

EC2에서 NginX로 https 적용해보기

JangKroed 2023. 3. 16. 23:19
728x90
반응형

항해 99 미니 프로젝트 진행 중 프런트 분들이 강의대로 하다 보니 versel이란 것을 사용하여 프런트 웹페이지 배포를 하셨는데 이게 하필 https만 지원하여 http로만 배포해 본 백엔드가 난처한 상황이 나오고, 결국 배포를 하지 못한 조가 나오는 참사가 벌어졌었다.. 이후 클론 프로젝트 진행하며 썼던 글을 다시 정리해보려고 한다.

(이전 글 보러가기)

 

처음 할 일

  • SSL 인증서를 무료로 발급해 주는 Let’s Encrypt를 사용할 계획
  • Let’s Encyrpt는 Certbot 사용을 권장
  • 시작하기 전에 ec2 인스턴스 보안탭에서 443번 포트를 IPv4로 열어 주어야 합니다.
  • 그리고 포트포워딩을 위해 아래 명령어를 먼저 입력 후 진행
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 3000

맨 마지막에 들어가는 3000은 진행 중인 프로젝트의 포트번호를 넣어준다. (포트포워딩 알아보기)

 

필요한 패키지 설치하기

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 certbot

 

인증서 발급받기

sudo certbot certonly --manual -d '*.도메인주소' -d 도메인주소 --preferred-challenges dns

입력하고 나면 인증받을 이메일을 입력하라는 문구가 나오고, 입력하고나면 아래와 비슷한 화면이 나온다.

DNS인증하는 과정이므로 위에 쓰여있는 Press Enter to Continue는. DNS 인증 후 해준다.

 

필자는 가비아로 도메인을 등록하여 가비아로 설명한다.

마이 가비아 → 관리 → DNS정보 → 도메인 연결 → 설정 버튼을 누른 뒤 레코드 수정버튼 클릭

위와 같이 DNS 설정 완료 후 설정 시간을 조금 기다린 후 엔터를 눌러 진행합니다. (총 2회 진행)

/etc/letsencrypt/live/도메인주소/fullchain.pem
/etc/letsencrypt/live/도메인주소/privkey.pem
/etc/letsencrypt/live/도메인주소/cert.pem

정상적으로 발급이 완료되었다면 위 경로에 인증서가 생성됩니다.

 

인증서 사용하여 배포하기

const fs      = require('fs');
const HTTPS   = require('https');
const port    = 3000;

// 운영 환경일때만 적용
if(process.env.NODE_ENV == "production"){
  try {
    const option = {
      ca: fs.readFileSync('/etc/letsencrypt/live/{myurl}/fullchain.pem'),
      key: fs.readFileSync('/etc/letsencrypt/live/{myurl}/privkey.pem'),
      cert: fs.readFileSync('/etc/letsencrypt/live/{myurl}/cert.pem')
    };

    HTTPS.createServer(option, app).listen(port, () => {
      console.log('HTTPS 서버가 실행되었습니다. 포트 :: ' + port);
    });
  } catch (error) {
    console.log('HTTPS 서버가 실행되지 않습니다.');
    console.log(error);
  }
}else{
  app.listen(port, () => {
    console.log('HTTP 서버가 실행되었습니다. 포트 :: ' + port);
  });
}

키파일은 관리자 권한으로 되어있으므로 서버 실행 시 관리자 권한으로 실행시켜 준다.

sudo node app.js

 

728x90
반응형