AWS linux2에서 Nginx로 Let's Encrypt 사용하기

infoqoch·2021년 4월 13일
1

http / 네트워크 

목록 보기
6/7

들어가며

  • HTTPS를 적용하기 위하여 많은 시도를 했다. 쉽지 않았다. linux 2, Nginx let's encrypt를 동시에 활용하여 적용한 글이 없었다. 비슷한 글이 있더라도 보안 등 다양한 이유로 설치 방법이 바뀌는 것으로 보였다. 많은 시간이 걸렸다. 여기저기 수많은 블로그를 보고 짜집기 하듯이 해결했다. 그리고 마침내.. HTTPS를 적용했다! 기쁘다!
  • 사실 내가 셋 다 익숙하지 않아서 발생한 삽질? 일수도 있겠지만. 하지만 이런 삽질 과정 속에서 nginx와 https, 서버의 리다이렉트 방식에 대해 이해할 수 있었다. 나와 같은 초보가 있다면 도움이 조금이라도 되기를 바라는 마음에 글을 작성한다.
  • 아직 공부할 것이 많아서 이 글이 완전하다 생각치 않는다. 그저 참고로 사용하기를 바란다! 그럼, Let's encrypt!

AWS에서 Nginx의 활용

  • nginx는 다양한 기능이 있을 테지만, 현재의 조건에서는 입력된 포트를 다른 포트로 리다이렉트 하는 역할로 사용한다. listen -> location
/etc/nginx/nginx.conf

    server {
        listen       80;
        listen       [::]:80;
        server_name  doreview.ga

        location /{
                proxy_pass http://localhost:8080;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
        }
  • nginx 의 conf 파일이다. conf 파일을 보면 listen이 있다. doreview.ga:80(doreview.ga)로 접근할 경우 location으로 이동한다는 의미이다. location의 코드는 지역의 8080으로 이동하는 것이며, 현재 어플리케이션이 작동중인 포트이다.

Let's Encrypt의 설치 및 설정

  • Let's Encrypt의 설치의 기본적인 도구는 certbot이다.내가 성공한 certbot 설치 과정은 아래와 같다. Certbot의 종속성에 필요로 한 EPEL7 저장소를 설치한 후 certbot을 설치한다.
cd /home/ec2-user
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 repolist
sudo yum install -y certbot
sudo yum install certbot-nginx
sudo service nginx stop
sudo certbot --nginx

참고 : https://flamingotiger.github.io/backend/devOps/aws-linux2-certbot-nginx/#lg=1&slide=2
  • 여기서 nginx의 설치 과정에 문제가 발생했다. 설치 과정에서 domain을 요구할 때, doreview.ga을 입력해도 작업이 진행 되지 않았다. 그래서 아래의 코드를 대신하여 domain을 설정할 수 있었다.
sudo certbot --nginx -d doreview.ga
  • 어떤 경우, certbot의 설치만으로도 nginx의 conf 설정을 자동으로 해준다고 한다. 나의 경우 그렇지 않았다. /etc/nginx/nginx.conf 을 아래와 같이 직접 수정했다.

nginx 설정 파일 수정

  • nginx를 통해 포트의 흐름을 변경해야 한다. 우리가 해야할 것은 80포트를 433(https)으로 리다이렉트 해야하며, 433을 8080으로 리다이렉트 해야 한다.
  • 먼저 80 -> 433을 해보자.
    server {
        listen       80;
        listen       [::]:80;
        server_name  doreview.ga

        listen 443 ssl; # managed by Certbot

        root /var/www/html;


        # RSA certificate
        ssl_certificate /etc/letsencrypt/live/doreview.ga/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/doreview.ga/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

        if ($scheme != "https") {
            return 301 https://$host$request_uri;
        } # managed by Certbot
    }
  • 위의 코드에서 핵심은 $scheme != "https" 이다. https가 아니면 https로 리다이렉트 한다.
  • 그 다음 과정은 433(https) -> 웹 어플리케이션(8080)이다. 그 코드는 아래와 같다.
# SSL configuration
   server {
        listen 443 ssl;
        listen [::]:443 ssl;
        server_name doreview.ga
        listen 443 ssl; # managed by Certbo
        root /var/www/html;

        ssl_certificate      /etc/letsencrypt/live/doreview.ga/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/doreview.ga/privkey.pem;

        # Required for LE certificate enrollment using certbot
        include /etc/nginx/default.d/*.conf;

        location /{
        proxy_pass http://localhost:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
}

나아가며

  • HTTPS의 적용 과정이 다난다사 했다. 그 과정에서 알게 된 몇 가지를 정리하고 글을 마치고자 한다.
  • SSL을 적용할 때 보통은 도메인을 필요로 한다. 그러므로 도메인을 구매하자. 무료 도메인은 Freenom에서 구매하면 된다.
  • NameServer을 따로 설정해야 하는 경우도 있는 것 같다. 그 경우 해당 도메인을 aws route 53를 사용하거나 CloudFlare를 사용하면 될 것 같다.
  • nginx의 설치 방법과 명령어는 다음의 링크를 참고했다. 참고로 nginx 명령어도 버전마다 다른 것 같다. https://msyu1207.tistory.com/entry/AWS-EC2%EC%97%90-NGINX-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
  • 전반적으로 서버 활용에 대한 이해가 낮은 것을 많이 실감했다. 리눅스에 대한 학습을 따로 해야할 것 같다.

추가

갱신하기

  • letsEncrypt의 경우 3개월마다 유효기간이 만료한다. 최근에 알람 메일이 왔고, 이번에 갱신했다. 아래의 명령어 한 번이면 끝난다!
  • sudo certbot
  • 기타 다양한 명령어는 꼭 공식문서를 보자. 블로그의 문서는 작동 안하는 경우가 많다ㅠ 그래서 삽질하다가 공식문서에서 해결했다.
  • https://letsencrypt.org/
profile
JAVA web developer

1개의 댓글

comment-user-thumbnail
2022년 4월 11일

amazon linux extras에 epel 이 있어욥

답글 달기