HTTPS 적용하기
기타

HTTPS 적용하기

HTTPS란?

웹 통신 프로토콜인 HTTP의 보안이 강화된 버전이다.

HTTPS는 소켓 통신에서 일반 텍스트를 이용하는 대신에, SSL이나 TLS 프로토콜을 통해 세션 데이터를 암호화한다.

 

 

 

 

1. SSL 인증서

- SSL인증서란?

SSL은 Secure Sockets Layer의 약자이다. 인터넷을 할 때 데이터 내용을 암호화 해주는 프로토콜(규칙)이다.

SSL인증서는 이런 보안통신을 하기 위한 전자 파일이다. SSL인증서를 서버에 설치함으로써 SSL 프로토콜을 사용하여 보안 통신을 할 수 있게 된다.

 

SSL 인증서는 무료와 유로가 있고, 무료 인증서의 경우 해당 인증서를 적용하여 서비스 도중 보안 문제가 발생하여 피해를 입었을 시 배상금 및 보증책임을 지지 않는 조건으로 보급하고 있다.

SSL 인증서 적용을 위해서는 ip주소가 아닌 도메인이 필요하다.

 

 

 

 

 

2. letsencrypt SSL 인증서 설치

letsencrypt는 https 인증서 발급과 적용이 쉽다.

인증서를 자동으로 발급하고 갱신해주는 봇 프로그램인 cerbot을 이용한다.

 

우선 EC2 서버에 접속한다.

우분투 버전 14.04와 16.04 이후 버전을 나누어서 설명한다.

 

 

- 우분투 버전 14.04일 경우

standalone 방식으로 인증서를 설치해본다.

standalone 방식은 서버가 꺼진 상황에서 certbot이 간이로 잠깐 키고 인증하는 방식이다.

 

다음 명령어를 실행한다.

wget https://dl.eff.org/certbot-auto

실행 권한을 추가한다.

chmod a+x certbot-auto

 

그 다음 ls를 해보면 certbot-auto가 설치된 것을 확인할 수 있다.

 certbot-auto가 인증서를 제공한다.

이때 80번, 443번 포트에 아무 프로세스도 없도록 비워두어야 한다. 

pm2 kill

위 명령어로 실행 중인 프로세스를 없앤다.

 

다음 밑의 명령어를 실행한다.

./certbot-auto certonly --standalone

만약 Permission denied가 나온다면 권한설정을 해주어야 한다.

 

- 권한설정

sudo su

위 명령어로 슈퍼유저로 접속한다.

chmod +x certbot-auto

certbot-auto에 실행 권한을 부여한다.

 

다음 밑의 명령어를 다시 실행한다.

./certbot-auto certonly --standalone

설치 중 이메일 입력하라는 화면이 나오면 이메일을 입력하고 동의를 요구하면 동의하면 된다.

도메인을 입력하라는 화면이 나오면 내 사이트 도메인 주소를 입력한다.

 

Congratulations! 라는 글이 보이면 실치 완료!

위 과정을 프론트 서버에서도 똑같이 적용해주어야 한다.

 

 

우분투 버전 16.04 또는 이후 버전일 경우

webroot 방식으로 인증서를 설치해본다.

인증서 설치를 하기 전에 해당 프로젝트의 포트를 80번 포트와 포트포워딩을 해야 한다.

우선 서버에서 express가 실행 중인 root 폴더로 이동한다.

그 후 다음 명령어를 실행한다.

apt-get install letsencrypt
mkdir public
mkdir -p .well-known/acme-challenge
vi app.js

 

[ letsencrypt 인증 원리 ]

  1. 요청한 도메인의 특정 경로와 파일이 인식되면 임시키 발급  
    certbot certonly --webroot -w ./public -d [DOMAIN]
    (특정 경로 : ./public , 도메인 : [DOMAIN])
  2. http요청으로 발급한 임시키에 접근되는지 확인: 바로 이 단계에서 letsencrypt가 서버에 http(80번포트)로 요청하는데 이 요청을 처리하지 못하면 인증서가 발급되지 않는다. 즉, 80번 포트로 우리의 서버가 접근 가능하게 하니까 포트포워딩이 필요

 

 

그 다음 프로젝트의 app.js에 다음 코드를 추가한다.

app.use(express.static('public'));

그 후 다음 명령어를 입력한다.

cd ..
pm2 stop app.js
pm2 start app.js
certbot certonly --webroot -w ./public -d [DOMAIN]

Congratulations! 라는 글이 보이면 실치 완료!

 

 

 

 

3. HTTPS express에 적용

const fs = require('fs');
const Https=require("https");

const options = { // letsencrypt로 받은 인증서 경로를 입력
 ca: fs.readFileSync('/etc/letsencrypt/live/[도메인 명]/fullchain.pem'),
 key: fs.readFileSync('/etc/letsencrypt/live/[도메인 명]/privkey.pem'),
 cert: fs.readFileSync('/etc/letsencrypt/live/[도메인 명]/cert.pem')
 };

Https.createServer(options, app).listen(443);

https 접속을 위한 443 포트를 열어준다. 443 포트는 https의 기본 포트이다.

 

 

 

 

 

4. EC2 방화벽 오픈

인바운드 규칙 편집에서 HTTPS 프로토콜 수신을 허용하도록 편집한다.

HTTPS에 관한 규칙 추가

 

 

 

 

5. HTTP로 접속할 경우 HTTPS로 redirect 해주기

클라이언트에서 http로 접속할 경우에도 자동으로 https로 접속할 수 있도록 처리해 줘야 한다.

아래 코드를 app.js에 추가해준다.

미들웨어 최상단에 작성해 주어야 한다.

app.use(function(req, res, next){
        if(!req.secure){
                res.redirect("https://" + "[도메인]" + req.url)
        }else{
                next()
        }
})

모든 접속에 대해 secure 접속 여부를 확인하고, 아닌 경우에는 https 경로로 리다이렉트 해주는 코드이다.

 

 

 

 

 

6. letsencrypt 자동 갱신

letsencrypt는 90일동안 유효한 무료 인증서이다. 그래서 90일이 되기 전에 갱신을 해줘야 한다.
linux의 스케쥴러인 crontab으로 자동 갱신 설정하는 방법이 있다.

 

 

 

[ crontab 명령어 ]

: 일정 시간마다 정해진 작업을 실행하게 하는 명령어

명령어 설명

[ 분 ][ 시 ] [ 일 ][ 월 ] [ 요일 ] 순서로 기입

 

 

명령어 예시
0 0 1 */2 * /usr/bin/certbot renew --renew-hook="sudo pm2 restart inventory"
: 2개월마다 1일에 인증서를 갱신하고 서버 재시작!

 

 

crontab 사용해서 등록하는 방법

  • 현재 crontab 목록 확인
    sudo crontab -l​
  • crontab 등록
    sudo crontab -e​
     명령어 실행 후 위의 crontab 명령어 예시를 입력한다.
  • sudo crontab -l 로 다시 목록 확인
    여기까지 했다면 crontab 등록이 완료됐다.
  • crontab 실행 로그 확인
    view /var/log/syslog

 

- 끝 -