HTTPS 적용하기 본문

우아한테크코스 4기/프로젝트

HTTPS 적용하기

giron 2022. 7. 28. 18:11
728x90

프로젝트 진행하면서 HTTPS 적용기

  • HTTP
    • 인터넷 상에서 정보를 주고 받기위한 프로토콜(양식과 규칙의 체계)
    • 클라이언트와 서버 사이에 이루어지는 요청/응답 프로토콜
    • 암호화되지 않은 평문으로 데이터를 전송한다. (악의적인 감청, 데이터 변조의 가능성)
  • HTTPS
    • HTTP + secure
    • 모든 HTTP 요청과 응답 데이터는 네트워크로 보내지기 전에 암호화된다.
    • HTTPS는 HTTP의 하부에 SSL과 같은 보안계층을 제공함으로써 동작한다.

도메인

가비아에서 도메인을 구입하면 TTL을 설정할 수 있다. TTL에 대해서 학교에서 배웠는데 기억이 안나서 다시 찾아보았다..

ttl

TimeToLive의 약자로 Routing  Loop를 방지하여 무한 루프에 빠지는 것을 막을 수 있다. 또한 멀티 캐스팅할 때, 라우터 범위를 정해서 멀티 캐스트 범위를 제한할 수 있다. 

대칭키 와 비대칭 키 요약

대칭키와 비대칭키는 이미 많이 알려져있으므로 필자의 블로그에서는 다루지 않겠습니다.

정리

CA를 통한 SSL 인증 과정

서버, CA, 클라이언트가 있을 때,

  1. 서버는 자신의 정보와 공개키를 CA에 보냅니다.
  2. CA는 해당 정보를 확인 후, 정상적인 사이트로 판단되면 CA의 개인키로 암호화한 인증서를 서버에 보냅니다.
  3. 그리고 CA는 자신의 공개키를 클라이언트의 브라우저에 줍니다. -> 브라우저는 해당 키를 저장해둡니다.
  4. 유저가 브라우저에 접속하여 사이트에 접근을 합니다.
  5. 이때 사이트는 인증서를 클라이언트에게 전달해줍니다.
  6. 클라이언트는 CA의 공개키를 통해 해당 인증서를 복호화합니다.
  7. 사이트의 정보를 확인하고 자신의 대칭키를 인증서 안에 있던 서버의 공개키로 암호화해서 서버에 전달합니다.
  8. 서버는 자신의 개인키로 전달받은 암호문을 복호화합니다. 그러면 사용자의 대칭키를 얻게 됩니다.
  9. 이제 대칭키를 통해서 통신을 합니다!

certbot을 통한 인증서 발급

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository universe
$ sudo apt-get update
$ sudo apt-get install certbot python3-certbot-nginx

1. 프론트엔드 서버 (EC2 - ubuntu)

$ cd /etc/nginx/site-avaliable

해당 위치에서 myapp.conf라는 설정 파일을 만든다.

$ sudo vi myapp.conf

server {
  server_name gongseek.site;

  location / {
    root   /home/ubuntu/dist; //프론트 정적파일 경로
    index  index.html index.htm;
    try_files $uri $uri/ /index.html;
  }
}


$ sudo certbot --test-cert --nginx -d gongseek.site ( 인증서 발급 테스트를 진행한다.)
$ sudo certbot certificates -> 인증서 확인

$ sudo certbot --nginx -d gongseek.site -> 만약 위 경우에 인증서를 여러번 발급했다고 아래 사진처럼 실패한다면 아래 명령어를 계속 진행한다( 그전에 가비아에서 서브도메인으로 기존에 그냥 gongseek.site였다면 www.을 붙여서 하나 만들어준다.)
$ cd /etc/nginx/site-avaliable/
$ sudo vi myapp.conf

 -> server_name gongseek.site www.gongseek.site;추가한다.
$ sudo certbot --nginx -d gongseek.site -d www.gongseek.site
$ sudo certbot certificates -> 인증서 확인
$ sudo nginx -s reload

 

이후 웹사이트에 접속하면 https가 적용된 것을 확인할 수 있다.

 

만약 인증서 발급을 여러번 실패했다면 다음과 같은 에러가 나올 것이다.

인증서 발급 제한

이럴 때는 가비아에 들어가서 서브 도메인을 만들면 된다. 저희 팀은 gongseek.site에서 www.gongseek.site로 만들어서 해결했습니다. 그 후, server_name에 gongseek.site www.gongseek.site;  로 해준다.

2. 백엔드 서버 (EC2 - ubuntu) 내부에 jar파일 있을 때

백엔드의 도메인으로 프론트의 도메인과 다른 백엔드의 서브 도메인으로 만들어야 한다.

EC2 내부에 jar파일이 있으므로 127.0.0.1로 연결해준다. 만약 nginx를 다른 서버에 둔다면 jar파일이 있는 서버의 주소로 proxy_pass를 설정하면 된다. 

가비아에서 back.gongseek.site를 백앤드 ec2에 연결해야 한다.

server {
        server_name back.gongseek.site;
        location /{
                proxy_pass http://127.0.0.1:8080;
        }
}

 

$ sudo ln /etc/nginx/sites-available/myapp.conf /etc/nginx/sites-enabled/

$ sudo nginx -s reload

$ sudo nginx -t (nginx 상태 확인)

$ sudo certbot --test-cert --nginx -d back.gongseek.site (인증서 테스트를 해본다)

    -> front의 도메인과 다른 백엔드의 서브 도메인을 만들어야 한다.

$ sudo certbot --nginx -d back.gongseek.site ( 실제 인증서를 받는 작업이다)

재시도한다면 2번으로 하면 된다.

인증서 자동갱신

인증서를 매월 1일마다 갱신되도록 해봅시다.

$ sudo nano /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command
17 *   * * * root cd / && run-parts --report /etc/cron.hourly
25 6 *   * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 *   * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
0 0 1 * * root certbot renew --quiet <- 해당 부분을 추가해준다.
#
자동갱신은 설정
 

자동갱신을 추가해줬으니 명령어가 문제없이 작동하는지 아래 명령으로 갱신 테스트 해 봅니다.

$ sudo certbot renew --dry-run

–dry-run 옵션을 붙이면 실제 갱신이 아니라 명령어 수행중 오류가 발생하는지 미리 확인 해 볼 수 있습니다.

Reference

https://signpen.net/blog/2513870

728x90
Comments