본문 바로가기

Tutorial

[인증서] Let's Encrypt 를 사용하여 인증서 연결 + nginx

반응형

이번 포스팅은 Let's Encrypt에서 인증서를 발급받아

특정 도메인으로 보안 접속을 활성화하는 것에 대한 포스팅

 

 

 

Let's Encrypt

Let's Encrypt는 비영리 인터넷 보안 연구 그룹 (ISRG)에서 가져온 무료, 자동 및 공개 인증 기관

letsencrypt.org/ko/

 

Let's Encrypt - 무료 SSL/TLS 인증서

 

letsencrypt.org

이곳을 통해 무료로 인증서를 발급받아 사용할 예정

 

Let's Encrypt 클라이언트 다운로드

$ git clone https://github.com/letsencrypt/letsencrypt

> git clone을 사용하여 해당 클라이언트를 다운로드

 

해당 폴더로 접근 및 자동 설치 진행

# git clone 받은 폴더로 접속
$ cd letsencrypt

# 자동 설치 진행
$ ./letsencrypt-auto --help

> 설치가 완료되면 아래와 같은 화면을 볼 수 있다

 

 

인증서 발급 방식 : webroot 사용

> webroot / Standalone / DNS와 같은 여러 방식이 존재함

> 이번 포스팅에서는 webroot를 사용

> 실제 구동되고 있는 웹 서버에 특정 파일의 쓰기 작업이 가능한지를 통해 인증하는 방식

 

webroot로 사용할 폴더 생성

#webroot_path로 사용할 폴더 생성
$ mkdir -p /var/www/letsencrypt

> webroot-plugin은 {webroot-path}/.well-known/acme-challenge에 파일을 생성함

 

nginx의 conf 파일 변경

nginx를 이용해서 webroot 에 접근할 통로 오픈, 위 경로에 80 포트가 접근 가능하도록

# 현재 80으로 들어오면 키바나로 연결되도록 5601 포트로 proxy_pass를 설정함
server {
        listen 80;
        server_name [도메인];

        set $proxy_pass_url http://127.0.0.1:5601;

        location / {
                proxy_pass $proxy_pass_url;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
        }
				
        ## 인증서 발급을 위함 추가 설정 
        location ~ /\.well-known/acme-challenge/ {
                allow all;
                root /var/www/letsencrypt;
        }
}

> 현재 80포트로 들어오면 proxy_pass로 키바나가 실행되는 포트로 전달되도록 설정

> webroot 인증을 위해 아래 3줄 추가

 

NGINX 재시작

$ systemctl restart nginx

 

인증서 발급 요청

letsencrypt 폴더로 접근 후 생성

# 인증서 발급 요청
$ ./letsencrypt-auto certonly -a webroot --agree-tos -m [메일] -w /var/www/letsencrypt -d [도메인] --rsa-key-size 4096

> -m : 메일주소

> -w : 위에서 생성한 webroot path (/var/www/letsencrypt)

> -d : 도메인 이름

 

> 인증서 발급에 성공한다면 위와 같은 화면 출력

 

출력화면

 

발급된 인증서 확인

생성된 인증서 위치 : /etc/letsencrypt/live/[도메인명]

# 해당 인증서로 접근
cd /etc/letsencrypt/live/[도메인명]

총아래와 같이 4개의 인증서가 존재함

  • cert.pem : 도메인 인증서
  • chain.pem : Let's Encrypt chanin 인증서
  • fullchain.pem : cert.pem + chain.pem
  • privkey.pem : 인증서 개인키

 

인증서 적용하기

현재 nginx 설정 파일 (ssl 설정 X)

현재 아래 설정 파일은 80 포트로 접속할 경우 키바나로 연결되도록 설정

# 현재 80으로 들어오면 키바나로 연결되도록 5601 포트로 proxy_pass를 설정함
server {
        listen 80;
        server_name [도메인];

        set $proxy_pass_url http://127.0.0.1:5601;

        location / {
                proxy_pass $proxy_pass_url;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
        }
				
        ## 인증서 발급을 위함 추가 설정 
        location ~ /\.well-known/acme-challenge/ {
                allow all;
                root /var/www/letsencrypt;
        }
}

 

새로운 nginx 설정 파일 (ssl 설정)

기존 모든 HTTP 요청을 ssl 인증서를 통해 연결하도록 HTTPS로 리다이렉팅 한다

 

두 가지 방법이 존재함

- 모든 http 요청을 잡아서 https로 리다이렉팅

- 특정 apps/sites만 리다이렉팅

 

여기서는 모든 HTTP 요청을 HTTPS로 가도록 리다이렉팅

# 모든 http(80포트) 요청을 https로 리다이렉팅
server {
    listen 80 default_server;

    server_name _;

    return 301 https://$host$request_uri;
}

# 모든 https(443포트) 요청으로 들어오면 키바나로 연결되도록 5601 포트로 proxy_pass를 설정함
server {
        listen 443 ssl;
        server_name [도메인];
        
        ssl_certificate [위에서 생성한, 지정 도메인에 대한 fullchain.pem 키의 경로]
        ssl_certificate_key [위에서 생성한, 지정 도메인에 대한 privkey.pem 키의 경로]

        set $proxy_pass_url https://127.0.0.1:5601;

        location / {
                proxy_pass $proxy_pass_url;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
        }
				
        ## 인증서 발급을 위함 추가 설정 
        location ~ /\.well-known/acme-challenge/ {
                allow all;
                root /var/www/letsencrypt;
        }
}

> 위와 같이 설정하여, 모든 http 요청을 https로 리다이렉팅 하고, 그 후에 키바나로 접속하도록 proxy_pass 설정 완료

> 또한 위에서 생성한 인증서를 nginx에 연결해준다.

 

반응형