ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AWS EC2 인스턴스 HTTPS 서버 설정 (인증서 자동 갱신)
    프로젝트/개발자 지름길 2021. 12. 8. 05:00
    반응형

    AWS 인스턴스 HTTPS 서버 설정 방법은 크게 2가지가 있다.

     

    1. ELB(로드 밸런서)를 활용한 HTTPS 설정 (유료)

    2. EC2 인스턴스에서 HTTPS 설정 (무료)

     

    이 두 가지의 가장 큰 차이점은 비용 차이다. 아무래도 지금 이 글을 읽고 계신 분들은 저렴한 비용으로 HTTPS 서버를 운영하고 싶은 마음이 클거다. 아래 이미지는 다른 블로거의 ELB를 활용한 서버 운영에 대한 과금 내용이다. 인스턴스 비용은 4.62$에 불과하지만, ELB 비용은 13.9$를 차지하고 있는 것이 보인다. 개인 포트폴리오용 서버를 오픈하거나 간단한 서비스를 하는 사람들에게는 배보다 배꼽이 더 큰 격이다.

     

    로드 밸런서를 공부하고 싶은 분들이나 혹은 scale out(인스턴스 2개 이상)을 활용하시는 분들은 로드 밸런서 활용해서 HTTPS 설정하는 방법을 알아보시는 것을 추천한다.

     

    혹시 인스턴스가 1개 뿐일 예정이거나, 트래픽이 많아질때는 scale up 하실 분들이라면 나처럼 EC2 인스턴스에서 HTTPS 설정을 하는 것을 추천한다. 

     

    이제부터 무료 방법인 EC2 인스턴스에서 HTTPS 서버 설정을 알아보자. 

     

    https://two-track.tistory.com/9


    우리는 무료방법을 사용하기 위해서 aws linux2 환경에서 letsecrypt 인증서를 활용할거다. letsecrypt 인증서는 무료이며, 3개월 이내로 새롭게 갱신 해줘야한다. 새롭게 갱신하는 것 역시 자동화 할 수 있기에 평생 무료라고 볼 수 있다.

     

    무료 HTTPS 설정 진행 방법

    1. Nginx 설치

    2. 인증서 다운로드 (certbot)

    3. HTTPS 설정 (Nginx-인증서 연동)

    4. 인증서 자동 갱신


    1. Nginx 설치

    yum을 활용해서 nginx 설치를 하려면 세팅을 해줘야한다.

    sudo vi /etc/yum.repos.d/nginx.repo

    아래 텍스트를 복사 붙여넣기 해준다.

    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/centos/7/$basearch/
    gpgcheck=0
    enabled=1

    이제 yum을 활용하여 nginx 설치가 가능해진다.

    sudo yum install -y nginx

    이렇게 하면 설치가 완료된다. /etc/nginx 폴더가 생성된 것을 확인할 수 있다.

     

    2. 인증서 다운로드 (certbot)

     

    sudo wget -r --no-parent -A 'epel-release-*.rpm' http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/
    sudo rpm -Uvh dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-*.rpm
    sudo yum-config-manager --enable epel*
    sudo yum install -y certbot python2-certbot-apache
    sudo yum install certbot-nginx
    sudo yum install certbot -y

    이렇게 하면 인증서 다운로드 준비가 완료된다. 각 명령어에 대한 자세한 사항은 다음 블로그를 참고하도록 하자. https://m.blog.naver.com/hsmang/221836126462

    sudo certbot certonly --standalone -d programmershortcut.com
    
    예시) sudo certbot certonly --standalone -d programmershortcut.com

    이제 인증서 다운로드를 위해서 위 명령어를 실행한다. 그리고 문구들 나타나면 적절하게 넣어주고, 계속 진행하면 아래 그림과 같이 인증서 다운로드가 완료된다. 

    sudo certbot certificate

    위 명령어를 입력하면 아래와 같이 인증서 정보를 확인할 수 있다.

    3. HTTPS 설정 (Nginx-인증서 연동)

    이제부터 다운로드 받은 인증서를 nginx에서 사용할 수 있도록 설정하면 끝난다. 그러니깐 nginx 설정파일을 편집하자.

    sudo vim /etc/nginx/nginx.conf

    설정에서는 2가지 내용이 있어야 한다. http 포트인 80번 포트와 https 포트인 443 포트에 대한 내용이다. 우선 첫 번째로 443 포트에 대한 내용을 먼저 아래와 같이 추가하도록 한다. (참고로 한글 주석 해놓은 부분들만 본인에게 맞도록 수정하면 된다.)

    server {
            listen       443 ssl http2;
            listen       [::]:443 ssl http2;
    
            # 본인 도메인을 입력하면 됨
            server_name  programmershortcut.com www.programmershortcut.com;
            root         /usr/share/nginx/html;
    
            # 인증서 위치를 본인에게 맞도록 설정해야함
            # 만약에 에러가 계속 발생하면 아래 폴더에 해당 파일들이 존재하는지 확인해보고
            # 없으면 다시 설치하면 된다.
            ssl_certificate "/etc/letsencrypt/live/programmershortcut.com/fullchain.pem";
            ssl_certificate_key "/etc/letsencrypt/live/programmershortcut.com/privkey.pem";
            ssl_session_cache shared:SSL:1m;
            ssl_session_timeout  10m;
            # ssl_ciphers PROFILE=SYSTEM;
            ssl_prefer_server_ciphers on;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    
    
            # Load configuration files for the default server block.
            include /etc/nginx/default.d/*.conf;
    
            location / {
                    proxy_redirect off;
                    proxy_pass_header Server;
                    proxy_set_header Host $http_host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Scheme $scheme;
    
                    #실제 내 소스 프로그램 포트
                    proxy_pass http://127.0.0.1:3000/;
            }
    
            error_page 404 /404.html;
                location = /40x.html {
            }
    
            error_page 500 502 503 504 /50x.html;
                location = /50x.html {
            }
        }

    두 번째로 우리는 http로 들어온 url은 https로 호출하도록 해야 한다. 그러니깐 기본포트인 80포트에 대한 설정 아래 박스친 부분에 대한 내용을 추가해준다. 그 외 server_name 정보를 설정해주고, 필요한 설정이 있다면 별도로 추가해준다.

    이로써 기본적인 설정이 완료되었다. https 설정이 되었으며, 자물쇠가 채워진 아이콘이 생겨난 모습을 볼 수 있다. 그리고 자물쇠 아이콘을 누르면 인증서 정보를 확인할 수 있다. (인증서 만료일도 확인 가능)

     

    나의 경우, 기존 프로그램 포트번호는 3000번이었지만, 이제는 nginx proxy 설정으로 인하여 기본 포트로 접속이 가능하다. 

     

    3000번 포트로 url을 호출하면 https가 적용되지 않는다. 그리고 사용자는 굳이 3000 포트로 접근할 필요가 없다. 이를 위해서 3000번 포트를 막는 작업이 추가로 필요하다. 

     

    4. 인증서 자동 갱신

    아래 이미지처럼 내가 발급받은 인증서 유효기간이 2022년 3월 7일까지로 적혀져있다. 아마 인증서 유효기간이 만료되면 웹 접근이 불가능할거다. http는 https로 호출하도록 했고, https 호출을 위한 인증서 기간은 만료되었기 때문이다. http로 호출되는지는 자료를 찾아봐야겠지만, 확실한거는 인증서 갱신이 필요하다는거다. 그래서 인증서 자동 갱신하도록 설정을 추가한다.

    우선 정상적으로 갱신 가능한지 다음 코드를 활용해서 테스트한다.

    sudo certbot renew --dry-run

    정상적으로 갱신이 가능하다면 아래 이미지처럼 문구가 나타난다.

    이제부터 crontab 이라는 스케줄러를 활용해서 'sudo certbot renew' 키워드를 특정 주기마다 새롭게 갱신하도록 하겠다.

     

    아래 명령어를 입력해서 crontab을 수정한다.

    sudo crontab -e

    다음 명령어를 집어넣자. 다음 명령어는 매일 새벽 5시 00분에 certbot renew 명령어를 실행한다. 그리고 명령어가 정상 수행하고 나면 'sudo systemctl restart nginx'를 통해서 nginx를 재시작한다.

    0 5 * * * certbot renew --renew-hook="sudo systemctl restart nginx"

    이제 다음날이 되어서 정상적으로 갱신되었는지 확인해보도록 한다. 물론 나도 글을 쓴 현재 시점은 확인 못해봤다. 내일 아침에 확인해 볼 예정이다. 확인은 아래 명령어로 날짜가 갱신 되었는지 확인하면 된다. 혹은 사이트에 직접 접속하여 인증서 유효기간을 확인해도 된다.

    sudo certbot certificates


    처음에는 여기저기 블로그 돌아다니면서 내용들로 억지로 설정할 수 있었다. 그래서 어떻게 구성된지는 정확하게 몰랐으나, 이번에 블로그 내용을 정리하면서 한번 더 세팅을 해봤다. 그러므로써 이 내용에 대해서 조금 더 확실하게 이해할 수 있었다.

     

    잘못된 내용이 있거나, 궁금한 사항이 있으면 댓글 부탁드립니다.

    반응형

    '프로젝트 > 개발자 지름길' 카테고리의 다른 글

    퍼블리싱...  (0) 2021.12.17
    퍼블리싱...  (0) 2021.12.17
    Node.js & mongoose 히스토리 관리 2편  (0) 2021.12.06
    aws ec2 인스턴스를 활용한 서비스 오픈 (feat. git, Node.js)  (0) 2021.12.04
    REST API 적용  (0) 2021.12.03

    댓글

Designed by Tistory.