코딩 발걸음 - 한발두발개발

Express Let's Encrypt 적용 및 Nginx설치, 설정 본문

카테고리 없음

Express Let's Encrypt 적용 및 Nginx설치, 설정

한발두발개발 2022. 7. 7. 01:56
728x90

1.Certbot 설치

add-apt-repository ppa:certbot/certbot

apt-get update

apt-get install certbot

 

 

2. 인증서 발급 --standalone이용

 --manual, --standalone, --webroot 등의 방식이 있음

플러그인 자동갱신 와일드카드 외부에서 .well-known 폴더
접근가능 여부
--manual X O O
(발급시 접근이 가능해야함.)
--standalone O
(발급 및 자동 갱신시 서버 닫아야함)
X X
--webroot O
(발급 및 자동 갱신시 서버 안닫아도됨)
X O
(발급 및 자동갱신에 신경을 끄기 위해 항상 접근이 가능해야함.)

공부해본 결과 위와 같은 특징이 있다. 

자동갱신 필요(새벽에 자동갱신 시키면 될 듯 함)와 보안적으로 --standalone이 낫다고 판단하여 --standalone방식으로 설치.

certbot certonly --standalone -d 도메인.com -d www.도메인.com

*--standalone 방식으로 설치시 주의점은 certbot이 80포트를 사용해야 하기 때문에 80포트를 사용하고 있으면 안되고(웹서버를 중지해야함.) 웹서버 구동시 80포트로 작동이 되어야함. 8910으로 웹서버를 실행시키고 80 => 8910으로 포트포워딩 설정하여 사용중이 었는데 포트포워딩을 해제하고 80포트로 웹서버를 실행해야함.

#iptables 포트포워딩 확인
iptables -nL -t nat

#포트포워딩 설정 삭제 -D
iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8910

#포트포워딩 설정 추가 -A
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8910

 

3. 정상 발행시 자동갱신 테스트

certbot renew --dry-run
#--dry-run 옵션은 자동갱신 모의 테스트이고 실제 갱신시에는
# certbot renew 을 사용

 

4. 자동갱신을 위한 .sh파일 생성

#크론탭이 실행하려는 자동갱신 명령어를 등록
vi /bin/letsencrypt.sh

#/bin/letsencrypt.sh의 내용

#!/bin/sh
kill -9 $(ps -ef | grep node | awk '{print $2}')
/usr/bin/certbot renew > /var/log/letsencrypt/le-renew.log
cd /app.js가 있는 웹서버 루트경로
nohup node app.js &

#작성후 /bin 경로에서 letsencrypt.sh를 입력하여 테스트로 실행해본다.
#서버가 꺼지는 것을 확인 뒤
#Cert not yet due for renewal 아직 renew를 실행할 수 있는 날짜가 되지 않았다는 출력이 나오고
#다시 서버가 실행되면 성공

5. 크론탭 등록

#크론탭 설정
crontab -e

# 00분 03시 1일이 될때마다 (매월) /bin/letsencrypt.sh실행
# 추가로 /bin/cronlog 디렉토리를 생성해주면 스크립트 출력 내용이 로그로 남는다.
# 로그로 남길 필요 없으면 > /bin/cronlog/radate_$(date +\%m\%d_\%H\%M).log 2>&1 & 은 생략가능
00 03 1 * * /bin/letsencrypt.sh > /bin/cronlog/radate_$(date +\%m\%d_\%H\%M).log 2>&1 &

 

 

+ Nginx 설치 및 설정

1.Nginx 설치

apt-get update

apt-get install nginx

2. 기존설정파일삭제

rm /etc/nginx/sites-enabled/default

rm /etc/nginx/sites-available/default

3. 서버의 이름으로 설정파일생성

vi /etc/nginx/sites-enabled/도메인명.conf

4. 도메인명.conf 내용

server {

    listen 80;

    server_name 도메인.co.kr www.도메인.co.kr;

    //와일드카드 포함 사이트명을 빈칸으로 띄워서 나열한다. 

    location / {

        return 301 https://$host$request_uri;

    }

}

server {

    listen 443 ssl;

    server_name 도메인.co.kr www.도메인.co.kr;

    //와일드카드 포함 사이트명을 빈칸으로 띄워서 나열한다. 

    ssl_certificate /etc/letsencrypt/live/도메인.co.kr/fullchain.pem;

    ssl_certificate_key /etc/letsencrypt/live/도메인.co.kr/privkey.pem;

    gzip on;

    gzip_comp_level 2;

    gzip_proxied any;

    gzip_min_length  1000;

    gzip_disable     "MSIE [1-6]\."

    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    location / {

      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;

      proxy_set_header X-NginX-Proxy true;

      proxy_pass http://127.0.0.1:8089/; // 8089 => 웹 서버의 리슨포트로 적어준다.

      proxy_redirect off;

      proxy_buffer_size          128k;

      proxy_buffers              4 256k;

      proxy_busy_buffers_size    256k;

    }

}

# Nginx 미사용시 웹 서버 포트를 80 으로 설정 하여 실행해야 했지만 
# Nginx를 사용할 경우 80 포트를 Nginx에서 Listen해야 하기 때문에
# 웹서버 포트는 8089포트(혹은 다른포트)로 실행해준다.

 

5. 생성한 파일들에 대한 심볼릭링크 생성해준다.

ln -s /etc/nginx/sites-enabled/도메인.conf /etc/nginx/sites-available/

6. nginx 재시작

/etc/init.d/nginx restart

#웹서버 app.js는 실행되고 있어야한다.

 

7. 자동갱신을 위한 .sh파일 생성

 

#크론탭이 실행하려는 자동갱신 명령어를 등록
vi /bin/letsencrypt.sh

#/bin/letsencrypt.sh의 내용

#!/bin/sh
/etc/init.d/nginx stop
/usr/bin/certbot renew > /var/log/letsencrypt/le-renew.log
fuser -k 80/tcp
/etc/init.d/nginx start

#작성후 /bin 경로에서 letsencrypt.sh를 입력하여 테스트로 실행해본다.
#서버가 꺼지는 것을 확인 뒤
#Cert not yet due for renewal 아직 renew를 실행할 수 있는 날짜가 되지 않았다는 출력이 나오고
#다시 서버가 실행되면 성공