Nginx

Nginx | SSL 인증 ( https ) 무료로 적용하기 Let's Encrypt

개발자티포 2022. 6. 24. 16:53
728x90
반응형

Let's Encrypt로 받는 인증은 90일에 한 번씩 갱신을 해주어야 한다.

 

Let's Encrypt로 인증받는 방법은 4가지가 있다.

  1. webroot : 사이트 디렉토리 내에 인증서 유효성을 확인할 수 있는 파일을 업로드하여 인증서를 발급하는 방법
    . 실제 작동하고 있는 웹서버의 특정 데렉토리의 특정 파일 쓰기 작업을 통해서 인증
    . 이 방식의 장점은 nginx를 중단시킬 필요가 없음.
    . 이 방법의 단점은 인증 명령에 하나의 도메인 인증서만 발급 가능
  2. 웹서버
    . Nginx나 아파치와 같은 웹서버에서 직접 SSL 인증을 실시하고 웹서버에 맞는 SSL세팅값을 부여
    . 발급이나 갱신을 위해 웹서버를 중단시킬 필요가 없음
    . 인증서 갱신 시 상황에 맞게 세팅을 자동으로 업데이트
    . 사용자가 세팅을 변경할 수 있지만 자동 업데이트 시 반영되지는 않음
  3. Standalone : 사이트 작동을 멈추고 이 사이트의 네크워킹을 이용해 사이트 유효성을 확인해 Let’s Encrypt SSL 인증서를 발급하는 방식
    . 80포트로 가상 staandalone 웹서버를 띄워 인증서를 발급
    . 이 방식은 동시에 여러 도메인을 발급 받을 수 있음
    . 그렇지만 인증서 발급 전에 Nginx를 중단하고 발급 완료 후 다시 Nginx를 시작해야 함
  4. DNS : 도메인을 쿼리해 확인되는 TXT 레코드로 사이트 유효성을 확인하는 방법
    . 와일드 카드 방식으로 인증서를 발급 가능
    . 이 방법은 당연하게도 서버 관리자가 도메인 DNS를 관리/수정할 수 있어야 하며
    . 인증서 갱신 시마다 DNS에서 TXT값을 변경해야 하므로
    외부에서 TXT 레코드를 입력할 수 있도록 DNS가 API를 제공하는 경우만 갱신 과정을 자동으로 처리(클라우두플레어 API가 대표적인 사례)

여기서 설명할 방법은 webroot를 이용한 방법이다.

 

1. certbot ( letsencrypt ) 설치해준다

$ sudo apt-get install certbot

 

2. 폴더를 만들어준다. 

$ mkdir -p /var/www/letsencrypt/.well-known/acme-challenge

 

3. 아래 명령어로 파일을 만들고 내용을 추가해준다.

$ vi /etc/nginx/snippets/letsencrypt.conf

letsencrypt.conf

location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/www/letsencrypt;
}

4. nginx 를 설정해준다. 

https://typo.tistory.com/entry/nginx-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EB%B0%A9%ED%99%94%EB%B2%BD-%EA%B5%AC%EC%84%B1

 

nginx 설치 및 방화벽 구성(http)

1. 먼저 업데이트를 실행 후 nginx를 설치해준다. $sudo apt update $sudo apt install nginx 2. 방화벽을 설정해준다. $sudo ufw allow 'Nginx Full' $sudo ufw status 3. 설정 파일을 확인해준다. $vi /etc/ngin..

typo.tistory.com

 

5. nginx 설정에 아래와 같이 include를 추가해준다.

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    server_name [도메인이름];

    include /etc/nginx/snippets/letsencrypt.conf;

    location / {
        return 301 https://[도메인이름]$request_uri;
        expires epoch;
        # return 301 아래에 expires epoch; 을 붙여주는 것은 301 리다이렉트가 캐싱되지 않도록 하기 위함
    }

}

 

6. 서버를 킨 상태에서 인증서를 발급한다.

$ certbot certonly --webroot --webroot-path=/var/www/letsencrypt  -d 사이트명

 

결과화면

 

7. 위 사진을 보고  pem의 위치를 알아두고 nginx 설정파일에 다음과 같이 추가해준다.

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        server_name [도메인이름];

        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;
                return 301 https://[도메인이름]$request_uri;
                expires epoch;
                # return 301 아래에 expires epoch; 을 붙여주는 것은 301 리다이렉트가 캐싱되지 않도록 하기 위함
        }

}

server {

        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;
        server_name [도메인이름];

        include /etc/nginx/snippets/letsencrypt.conf;

        ssl_certificate /etc/letsencrypt/live/[도메인이름]/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/[도메인이름]/privkey.pem;
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout 1440m;
        ssl_buffer_size 8k;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_stapling on;
        ssl_stapling_verify on;

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

        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를 여러개 만들어준다.

8. nginx 를 재시동 하고 서버를 켜보면 !!

$ sudo systemctl restart nginx

 

 

자물쇠가 잘 생긴 것을 볼 수 있다.

 

이외의 명령어들

 

- 인증서 남은 기간 확인

$ certbot certificates

 

- 제대로 갱신이 되는지 확인

$ certbot renew --dry-run

 

- 자동 갱신 명령어 입력

$ certbot renew

 

- 크론탭을 이용한 예약 명령어

$ vi /etc/crontab
0 0 1 * * /usr/bin/certbot renew --renew-hook="서비스재시작명령어"
728x90
반응형