본문 바로가기



NodeJs 05: nginx에서 SSL인증서 설정



안녕하세요. 각성한 데브키라입니다. nodejs사이트 2개를 nginx와 연동하여 멀티사이트로 운영하면서 SSL인증서 까지 설정해 보도록 하겠습니다.

 

1. NODEJS설치 

본 사이트의 다음 포스팅을 참조하세요.

NodeJs 02: 노드JS를 시작하기 위한 설치와 환경설정 (alphonse.kr)

2. Nginx연동

본 사이트의 다음 포스팅을 참조하세요.

NodeJs 04: 노드JS사이트에 nginx연동 (alphonse.kr)

3. SSL인증서 설치 

1, 2번에서 절차를 통해서 2개의 웹사이트를 nginx와 연동하였고 각각 alphonse.kr, test.alphonse.kr로 접속이 가능합니다.

하지만 ssl인증서 설치가 되지않았기 때문에 주소표시줄에 "안전하지 않은사이트"라고 표시가 됩니다.

그부분을 SSL인증서를 통해서 해결해 보겠습니다.

 

웹사이트에 SSL 인증서를 설치하면 "안전하지 않음"이라는 경고 없이 안전하게 사이트를 이용할 수 있습니다. 
무료 SSL 인증서를 발급해주는 Let's Encrypt를 사용하면 좋습니다. 
Let's Encrypt 인증서를 설치하는 방법은 다음과 같습니다.

 

3_1. 먼저 Certbot을 설치해야 합니다. Certbot은 Let's Encrypt 인증서를 쉽게 설치할 수 있도록 도와주는 도구입니다. 

아래의 명령어로 Certbot을 설치할 수 있습니다.

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot python3-certbot-nginx

3_2. Certbot을 사용해서 SSL 인증서를 발급받습니다. 아래의 명령어를 실행하면 됩니다.

설치시 입력 : email주소입력 Enter > Y > Y

sudo certbot --nginx -d http://www.mydomain.kr -d mydomain.kr -d test.mydomain.kr

 

위의 명령어에서 -d 옵션 뒤에는 SSL 인증서를 발급받을 도메인 이름을 입력해야 합니다. 
여러 개의 도메인에 대해 인증서를 발급받으려면 -d 옵션을 여러 번 사용하면 됩니다.

 

3_3, 인증서 발급이 완료되면 Nginx 설정 파일에 SSL 관련 설정이 자동으로 추가됩니다. 

이 설정은 인증서와 관련된 파일의 위치, 리다이렉션 설정 등을 포함하고 있습니다.

 

3_4. NGINX설정파일 수정

sudo vi /etc/nginx/sites-available/mydomain  수정 후 wq!로 저장하고 나오시면 됩니다.

server {

    listen 80;

    listen 443 ssl;

    server_name www.mydomain.kr mydomain.kr;

​

    ssl_certificate /etc/letsencrypt/live/www.mydomain.kr/fullchain.pem;

    ssl_certificate_key /etc/letsencrypt/live/www.mydomain.kr/privkey.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    ssl_prefer_server_ciphers on;

​

    location / {

        proxy_pass http://localhost:3000;

        proxy_http_version 1.1;

        proxy_set_header Upgrade $http_upgrade;

        proxy_set_header Connection 'upgrade';

        proxy_set_header Host $host;

        proxy_cache_bypass $http_upgrade;

    }

}

​

server {

    listen 80;

    listen 443 ssl;

    server_name test.mydomain.kr;

​

    ssl_certificate /etc/letsencrypt/live/www.mydomain.kr/fullchain.pem;

    ssl_certificate_key /etc/letsencrypt/live/www.mydomain.kr/privkey.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    ssl_prefer_server_ciphers on;

​

    location / {

        proxy_pass http://localhost:3001;

        proxy_http_version 1.1;

        proxy_set_header Upgrade $http_upgrade;

        proxy_set_header Connection 'upgrade';

        proxy_set_header Host $host;

        proxy_cache_bypass $http_upgrade;

    }

}

 

3_4. 마지막으로, 설정파일 수정후 아래의 명령어를 실행해서 Nginx를 재시작합니다.

sudo systemctl restart nginx

3_5. 위 과정을 진행했지만 SSL인증서가 제대로 동작하지 않는다면 아래 과정을 진행합니다.

위 과정을 진행했지만 여전히 "안전하지 않은사이트"로 표시된다면 옵션에 문제가 있는지 확인해 봅니다.

ubuntu@mydomain-ubuntu:$ sudo openssl verify -CAfile /etc/letsencrypt/live/http://www.mydomain.kr/chain.pem /etc/letsencrypt/live/http://www.mydomain.kr/cert.pem

결과)
C = US, O = Internet Security Research Group, CN = ISRG Root X1
error 2 at 2 depth lookup: unable to get issuer certificate
error /etc/letsencrypt/live/http://www.mydomain.kr/cert.pem: verification failed

ubuntu@mydomain-ubuntu:$

 

openssl verify 명령의 결과에 따르면, 인증서 체인에 문제가 있어 보입니다.
Let's Encrypt 인증서의 체인을 검증하려면, 루트 인증서와 중간 인증서를 모두 포함하는 CA 번들 파일이 필요합니다. 

 

그런데 이 파일은 /etc/letsencrypt/live/http://www.mydomain.kr/chain.pem 에는 포함되어 있지 않습니다.
따라서, Let's Encrypt에서 제공하는 CA 번들 파일을 사용하여 인증서 체인을 검증해 보세요.
먼저, Let's Encrypt의 CA 번들을 다운로드 받습니다:

 

명령어)
wget https://letsencrypt.org/certs/isrgrootx1.pem
wget https://letsencrypt.org/certs/lets-encrypt-r3.pem

 

그 다음, 두 인증서를 하나의 파일로 합칩니다:

명령어)
cat isrgrootx1.pem lets-encrypt-r3.pem > letsencrypt_bundle.pem
마지막으로, 이 번들을 사용하여 인증서 체인을 검증합니다:
openssl verify -CAfile letsencrypt_bundle.pem /etc/letsencrypt/live/http://www.mydomain.kr/cert.pem
이 명령이 OK를 출력하면 인증서 체인이 올바르다는 것을 의미합니다. 
그렇지 않으면 인증서 체인에 문제가 있으며, 이는 웹 브라우저에서 사이트를 '안전하지 않음'으로 표시하는 원인일 수 있습니다.
실행결과 정상적으로 출력됩니다.

 

3_6. 인증서 자동갱신 스케쥴러 셋팅

Let's Encrypt 인증서는 90일마다 갱신해야 합니다. 이를 자동화하기 위해 Certbot이라는 도구를 사용할 수 있습니다.
Certbot은 이미 설치되어 있을 가능성이 높습니다. 만약 아직 설치되어 있지 않다면, 다음 명령어로 설치할 수 있습니다.

 

이미 설치되었는지 확인명령 입니다.

명령)
certbot --version
결과) 설치가 되어있는 경우 버전정보가 표시됩니다.
ubuntu@mydomain-ubuntu:~$ certbot --version
certbot 1.21.0

 

설치가 되지 않았다면 설치를 해야 합니다.

명령)

sudo apt-get update
sudo apt-get install certbot

 

자동 갱신을 설정하기 위해 crontab을 사용할 수 있습니다. 
crontab은 리눅스 시스템에서 주기적인 작업을 스케줄링하는 도구입니다.
다음 명령어를 사용하여 crontab을 편집합니다.

명령)
sudo crontab -e

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        
  2. /usr/bin/vim.basic <----- vi 선택
  3. /usr/bin/vim.tiny
  4. /bin/ed

 

crontab 파일에 다음 줄을 추가합니다. 이는 매일 새벽 4시에 인증서를 갱신하도록 설정합니다.

파일내용에 추가)
0 4 * * * /usr/bin/certbot renew --quiet

 

이제 Certbot은 매일 새벽 4시에 인증서를 갱신하려고 시도합니다. 
인증서의 유효 기간이 30일 이하로 남았을 때만 실제 갱신 작업이 이루어집니다.
마지막으로, 인증서가 갱신되었을 때 NGINX가 새 인증서를 사용하도록 하려면, NGINX를 재시작해야 합니다. 
이를 위해 --post-hook 옵션을 추가합니다.

0 4 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"

이렇게 하면 인증서가 갱신된 후에 NGINX가 자동으로 재시작되어 새 인증서를 사용하게 됩니다.

 

인증서 갱신스케쥴이 이미 설정되었는지 알수가 없는데 이것을 확인해 보려면 어떻게 해야할까요?
crontab에 어떤 작업이 스케줄링되어 있는지 확인하려면, 다음 명령어를 사용하면 됩니다.

명령)
sudo crontab -l

결과-등록된 스케쥴이 없을때)
ubuntu@mydomain-ubuntu:~$ sudo crontab -l
no crontab for root

 

이 명령어는 현재 사용자의 crontab에 등록된 모든 스케줄링된 작업을 출력합니다.
Certbot 갱신 작업이 스케줄링되어 있다면, 이 명령어의 출력에서 /usr/bin/certbot renew 라는 문자열을 찾을 수 있을 것입니다.
이 문자열이 없다면, Certbot 갱신 작업이 아직 스케줄링되지 않은 것입니다. 
이 경우, 이전에 제공한 지시사항을 따라 crontab에 Certbot 갱신 작업을 추가할 수 있습니다.

 

NodeJs 01: 노드JS의 특징과 활용사례를 소개합니다.
NodeJs 02: 노드JS를 시작하기 위한 설치와 환경설정 
NodeJs 03: 우분투에서 노드 JS 생성하고 구동하기 
NodeJs 04: 노드JS사이트에 nginx연동 
NodeJs 05: nginx에서 SSL인증서 설정 
NodeJs 06: Systemd를 이용한 Nginx서버 백그라운드 실행 운영  
NodeJs 07: NodeJs 웹사이트 개발에 필요한 플러그인 목록정리

[ NodeJs강좌 전체목록 ]

 

NodeJs: 기초부터 고급까지 실무 적용 완벽 가이드

안녕하세요. 데브키라입니다. 이 시리즈는 Node.js의 기본부터 고급 기술까지 단계별로 다룹니다. 서버 실행, 페이지 라우팅부터 nginx 연동, SSL 설정까지 실무 적용을 목표로 합니다. Node.js의 모든

devkira.alphonse.kr