#4 개발일지 - HTTPS 설정 Certbot으로 SSL 인증서 발급받기

송은·2023년 8월 13일
1

개발일지

목록 보기
4/6

우여곡절 끝에 배포까지 완료했다😂 오늘까지였는데 10일 안에 처음 해보는 로그인/회원가입, 배포까지 해보는 것은 좀 빡셌던 것 같다..게다가 최종 디자인도 어제 나왔기 때문에..하루..이틀 내에 화면그리고 배포하고 테스트까지 할 시간이 부족했다ㅠ
시간내에 프로젝트를 제출하는 것은 실패했지만 끝까지 프로젝트를 완성하고 싶어서 로컬에서 API 테스트, AWS 배포까지 완료하고 현재 HTTP 프로토콜로 되어있는 주소를 HTTPS 로 바꿔주려고 한다!!

현재 80포트로 접속했을 때 3000으로 보내주는 포트포워드까지 적용된 상태이다.
HTTPS로 설정해주기 위해서는 인증서가 필요한데 무료로 발급해주는 인증서를 사용해볼 것이다.
그것이 바로 certbot이다. 인증서를 자동으로 발급하고 갱신해준다.

설치

이전에 설치된 certbot과 충돌이 날 수 있으니 지워주고 시작

sudo apt-get remove certbot

snap 설치

certbot 공식 홈페이지에서는 snap을 통해 설치하는 것을 권장하고 있다.
snap을 설치해주고 진행하자

sudo apt update
sudo apt install snapd

certbot 설치

📑 공식문서 참고

  1. certbot 설치
sudo snap install --classic certbot
  1. certbot 명령을 시스템에서 실행할 수 있도록 준비
sudo ln -s /snap/bin/certbot /usr/bin/certbot
  1. 설치 확인
certbot --version

인증서 발급

sudo certbot --nginx -d 도메인

# ex) sudo certbot --nginx -d abc.com
# ex) sudo certbot --nginx -d abc.com -d www.abc.com

본인 이메일을 적어준다.

ACME 서버에 등록할 것인지 동의 여부 → Y 를 입력하여 동의

EFF 소식을 이메일로 받을지 선택 → 이메일 수신 여부는 자유롭게 선택 (Y/N)

그럼 인증서가 성공적으로 발급 된 것을 확인할 수 있다!


인증서 발급 내역 조회

sudo certbot certificates

발급받은 인증서의 만료 기간, 키 위치 등의 정보를 확인할 수 있다.


80포트 → 443포트 리다이렉트

이제 마지막으로 80포트 접속 시 https 기본 포트인 443으로 리다이렉트 처리만 해주면 된다.

sudo vi /etc/nginx/conf.d/default.conf

내가 설정해준 파일로 가면 certbot이 알아서 설정들을 추가해준 것을 볼 수 있다! (# managed by Certbot 이 붙은 부분)

여기에 proxy 설정들을 추가로 작성해주었다.

server {
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/도메인주소/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/도메인주소/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

        server_name 도메인주소;
        root /home/ubuntu/프로젝트폴더이름/build;
        index index.html index.htm;

        access_log  /var/log/nginx/access.log;
        error_log   /var/log/nginx/error.log;

        location / {
        		# 프록시 설정 추가 ✅
                proxy_pass http://localhost:3000;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_redirect off;
        }
}

server {
        if ($host = memo-re.shop) {
                return 301 https://$host$request_uri;
        } # managed by Certbot

        listen 80;
        server_name memo-re.shop;
        # 없애고 301 리디렉션 리턴하도록 수정 ✅
        # return 404; # managed by Certbot
        return 301 https://$host$request_uri;
}
sudo service nginx restart

nginx 설정 적용해주고 프로젝트를 실행하면 https://내 도메인주소 로 잘 접속된다!!🙆🏻‍♀️



우당탕탕 삽질🤣

certbot 삭제 과정

삭제했다가 다시 설치하면 기존의 남아있는 설정들 때문에 제대로 동작하지 않을 수 있기 때문에 완전 꼬인게 아니면 에러를 해결해보는 쪽이 더 좋을 것 같다. 아래 명령어를 모두 입력해주었다. (참고)

일단 certbot으로 받았던 인증서를 다시 삭제해주었다.

sudo certbot delete

👉 Which certificate would you like to delete?
삭제할 주소의 번호를 선택하고 enter 쳐주면 된다.

sudo rm -rf /etc/letsencrypt/
sudo rm -rf /var/lib/letsencrypt/
sudo rm -rf /var/log/letsencrypt/
sudo apt update
sudo apt upgrade
sudo apt autoremove
sudo snap remove certbot

마지막으로 snap 파일에 남아있는 certbot 폴더도 지워주었다.

cd snap
rm -rf certbot

이렇게까지 한 이후에 다시 설치 명령어를 입력하니까 다시 설치할 때 이미 설치되어 있다는 오류가 나지 않고 다시 설치되기는 했다..!


nginx.service failed

파일 설정 한 후에 sudo service nginx start 하니까 이런 에러가 난다.ㅠ

Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for details.

뭔가 꼬였다 싶어서 삭제를 하고 다시 설치하고 진행해야겠다 싶어서 했떠니 똑같은 오류가 난다...

명령어를 입력하고 에러코드를 확인해보았다.

$ sudo systemctl status nginx.service
× nginx.service - A high performance web server and a reverse proxy server
Failed to start A high performance web server and a reverse proxy server.

이런 에러문구가 뜬다. 자세하게 확인하기 위해 위에 안내된 명령어를 입력해보았다.

$ journalctl -xeu nginx.service

그러면 이런 안내가 나온다.

[emerg] open() "/etc/letsencrypt/options-ssl-nginx.conf" failed (2: No such file or directory) in /etc/nginx/nginx.conf:76
nginx: configuration file /etc/nginx/nginx.conf test failed

이 부분들을 확인해봐야할 것 같다.
/etc/letsencrypt 의 파일 목록을 보니까 renewal-hooks 밖에 없다. options-ssl-nginx.conf 파일을 생성해준다. 아래 코드가 기존에 자동으로 생성되는 파일인 것 같다. (Certbot Github 참고)

# This file contains important security parameters. If you modify this file
# manually, Certbot will be unable to automatically provide future security
# updates. Instead, Certbot will print and log an error message with a path to
# the up-to-date file that you will need to refer to when manually updating
# this file. Contents are based on https://ssl-config.mozilla.org

ssl_session_cache shared:le_nginx_SSL:10m;
ssl_session_timeout 1440m;
ssl_session_tickets off;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;

ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";

/etc/letsencrypt/ 디렉토리로 이동해서 SSL 옵션 파일을 생성해주자.

sudo vi /etc/letsencrypt/options-ssl-nginx.conf

i (편집) - 코드 붙여넣기 - esc - :wq 저장후 나가기

그러고 다시 명령어를 입력해서 상태를 확인해봤다. 이번엔 다른 오류로 바뀌어있다.

nginx: [emerg] cannot load certificate "/etc/letsencrypt/live/[도메인이름]/fullchain.pem": BIO_new_file() failed

이건 Certbot에서 인증서를 발급할 때 같이 제공된 공개키/개인키 파일들에 관한 것인 것 같다.
아무래도 삭제할 때 delete 명령어로 인증서까지 같이 지운게 문제인 것 같다.....

Certbot이 완전히 지워지지 않은건지, 아니면 다시 설치하는 과정에서 꼬인것 같아서 인스턴스를 다시 밀고 시도해보았다🥲

+) 이 때는 nginx 설정 적용(재시작)하는 명령어 입력 - 오류 - certbot 설정문제인가? nginx 설정을 잘못 건드렸나? certbot 확인하는 명령어도 오류가 나니까 멘붕이 왔었는데
certbot도 고장나고 있다고 생각해서 인증서를 다시 발급받을 수 없다고 생각했던 것 같다
아마 이 때 certbot 인증서 발급받는 명령어를 다시 입력해서 시도를 해보면 좋았지 않았을까 생각이 든다..! 그러면 아마 다음 오류가 또 나오거나..진행이 되었지 않았을까🤔


참고

profile
개발자

0개의 댓글