상세 컨텐츠

본문 제목

Certbot과 nginx로 https 적용하기!

프로젝트/내편

by seungpang 2023. 2. 3. 18:02

본문

반응형

https를 적용하기전 간단하게 SSL에 대해서 알아보자


SSL(Secure Socket Layer)


SSL은 웹서버와 클라이언트의 통신 암호화 프로토콜이다.

SSL이 적용되지 않은 통신의 경우, 평문이 그대로 전송된다. 만약 제 3자가 어떠한 방식으로든 통신 패킷을 탈취할 경우, 그 내용을 쉽게 확인할 수 있다. → 사용자 개인 정보나, 결제 정보와 같은 민감한 정보의 통신이라면 얘기가 달라진다.

SSL을 적용한다면 이러한 문제를 기술적으로 해결할 수 있다. 요청을 암호화해서 보내므로 통신 패킷이 탈취되더라도 복호화 키가 없으면 원래 내용을 알 수 없기 때문이다.

그렇다면 어떻게 적용해야 할까?

일단 시작하기 앞서서 준비해야할게 두가지가 있다. 하나는 도메인이고 다른 하나는 도메인과 Web Server의 연결이다.

요즘 도메인을 제공해주는 서비스(가비아, aws, 고대디 등등)가 많기때문에 이 부분에 대한 설정은 생략하고 nginx에서 설정하는 부분만 설명하고자 한다.


nginx 설치하기


$ sudo apt-get update #운영체제에서 사용 가능한 패키지들과 그 버전에 대한 정보(리스트) 업데이트 
$ sudo apt install nginx -y #nginx 설치하기
$ nginx -v #설치한 nginx 버전 확인
$ sudo service nginx status #nginx running 상태 확인

snapd 설치


snapd: 쉽게 말해 리눅스 통합 패키지 관리 툴

certbot 설치 페이지에서는 snapd로 설치하는 것을 권장했다.

sudo apt-get install snapd -y #snapd 를 설치하자
sudo systemctl enable --now snapd.socket #systemd 에 등록하자.
sudo systemctl list-unit-files | grep snapd.socket #잘 되었는지 확인
sudo ln -s /var/lib/snapd/snap /snap #공식 페이지에는 classic snap support 를 위해서 아래와 같이 링크를 만들라고 하고 있다
sudo systemctl start snapd #snapd 데몬 실행

Certbot이란?


https 페이지를 만들기 위해서는 ssl인증서를 발급받아 적용해야한다.

https를 확산시키기 위한 움직임으로 Let's encrypt의 형태로 ssl인증서를 무료로 제공하는 라이브러리가 생겼는데 그게 바로 Certbot이다.


certbot 설치


sudo snap install core; 
snap version # 버전 확인
sudo snap install --classic certbot # certbot 설치
sudo ln -s /snap/bin/certbot /usr/bin/certbot # certbot 명령어를 사용하기 위해 심볼릭링크를 걸기
certbot --version #버전 확인

인증서 발급


sudo certbot certonly --nginx -d {도메인주소}
  • certonly: 인증서만 발급받는다는 의미, 이 옵션이 없으면 자동으로 nginx 설정을 수정해 준다, 정확하게 인지하지 못한다면 사용하지 않는 것이 좋을수도 있다.
  • —nginx: nginx에 설정한다는 의미

위와 같은 명령어를 입력했으면 이메일 입력하는 창이 나오고 몇번의 Y/N을 입력하고 나면 Successfullu received certificate.가 나오면서 인증서 정보를 출력해 준다.

nginx 설정파일 수정


일단 nginx의 설정파일을 수정하기 전에 각각의 디렉토리와 역할에 대해 짧게 확인해보면

  • /etc/nginx/nginx.conf: Nginx에 관련한 설정파일로 nginx 설정에 관한 블록들이 작성되어 있다. 이 파일에서 sites-enabled 폴더에 있는 파일들을 include하여 파일들을 가져온다.
  • /etc/nginx/sites-available: 가상 서버 환경들에 대한 설정 파일들이 위치하는 디렉토리이다. 실제 가상 서버가 돌던 안 돌던 가상 서버와 관련된 설정 파일들은 여기에 놓도록 한다.
  • /etc/nginx/sites-enabled: sites-available에 있는 가상 서버 파일들중에서 실행시키고 싶은 파일을 symbolic link로 연결한 폴더이다. 이 폴더에 위치한 가상서버 환경 파일들을 읽어서 실제 서버를 세팅한다.

conf파일 생성


/etc/nginx/sites-available 아래 {{이름}}.conf파일을 생성 (이름은 자기 마음대로)

sudo vi test.conf
server {
  listen 80; #80포트로 받을 때
  server_name api.naepyeon.site; #도메인주소, 없을경우 localhost
  return 301 https://api.naepyeon.site$request_uri;

}
server {
  listen 443 ssl http2;
  server_name api.naepyeon.site;

  # ssl 인증서 적용하기
  ssl_certificate /etc/letsencrypt/live/{도메인주소}/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/{도메인주소}/privkey.pem;

  location / { # location 이후 특정 url을 처리하는 방법을 정의(여기서는 / -> 즉, 모든 request)
    proxy_pass http://{server ip}:8080; # Request에 대해 어디로 리다이렉트하는지 작성. 8080 -> 자신의 springboot app이사용하는 포트
    proxy_set_header Host $http_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;
  }
}
server {
    if ($host = {도메인주소}) {
        return 301 https://$host$request_uri;
    } 

  listen 80;
  server_name {도메인주소}
    return 404; 

}
  • proxy_pass: 프록시 주소
  • Host $http_host(HTTP Request의 Host 헤더 값): 클라이언트가 요청한 원래 호스트를 정의한다.
  • X-Real-IP $remote_addr: 실제 방문자 원격 ip 주소
  • X-Forwarded-For $proxy_add_x_forwared_for: 클라이언트가 프록시 처리한 모든 서버의 IP 주소를 포함하는 목록이다.
  • X-forwarded-Proto $scheme(HTTP의 구조로 http, https를 의미): HTTPS 서버 블록 내에서 사용할 경우 프록시 서버의 각 HTTP 응답이 HTTPS로 다시 작성된다.

nginx 설정 확인하기


sudo nginx -t #{도메인주소}.conf의 문법을 확인
sudo ln -s /etc/nginx/sites-available/{도메인주소}.conf /etc/nginx/sites-enabled
#sites-enabled에 심볼릭 링크를 생성
sudo ls -l /etc/nginx/sites-enabled

# nginx 재시작
$ sudo service nginx reload
또는
$ sudo service nginx restart

여기까지 문제없이 따라왔다면 설정이 모두 완료되었다는 의미이다.

설정했던 도메인으로 접속해보면 도메인 주소 옆에 자물쇠모양이 생긴걸 확인할 수 있다.

관련글 더보기